C#使用ILGenerator动态生成函数
游戏服务器里面总是有一大堆的配置文件需要读取, 而且这些配置文件的读取: * 要不然做成弱类型的, 就是一堆字符串或者数字, 不能看出来错误(需要重新检测一次) * 要不然做成强类型的, 每种类型都需要自己Parse一下
我个人比较喜欢后者, 因为前者LoadConfig的代码简单, 但是写逻辑的时候代码不简单.
class Config1 : public IConfig {
public void Fill(EntryLine& line);
int32_t param1;
string param2;
std::vector<int32_t> param3;
}; void Config1::Fill(EntryLine& line) {
this->param1 = line.ReadInt32();
this->param2 = line.ReadString();
this->param3 = line.ReadVectorInt32();
}
大概的填充函数就上上面写的那样, 只是ReadInt32
这种函数是虚构的, 需要你自己去实现(哼)
然后这种代码写起来很烦, 我不是很想写. 这是本文产生的原因.
C#里面有XML反序列化, 我定义一个类:
class Config1 {
int32 param1;
string param2;
int[] param3;
} XmlSerializer serializer = new XmlSerializer(typeof(Config1));
var obj = (Config1)serializer.Deserialize(stream);
这个反序列化就非常简单, 我其实要的就是这个东西, 只是Xml反序列化用的是Node, 而我想用属性, 另外一个就是属性的值我有一些自己个性化的东西在里面.
感谢微软提供了调试.NET Framework的功能, 让我可以调试.NET源码, 看看微软是怎么实现的.
研究了一番发现, 他居然是在XmlSerializer
构造的时候, 把Config1
分析了一遍, 然后生成的一些元数据, 和Read/Write
方法, Deserialize只是调用了一下Read
方法而已.
既然知道他是怎么实现的, 想必你研究一会儿, 也就能撸出来一个.
基本上你得先撸出来一个原型
, 然后再把原型
程序化.
PS: 暂时还没有测试性能, 应该不会太差, 最差就是服务器启动的是慢几秒.
XmlSerializationReaderILGen.cs
C#使用ILGenerator动态生成函数的更多相关文章
- 你不知道的Javascript(上卷)读书笔记之二 ---- 词法作用域
在前一篇文章中,我们把作用域定义为"管理.维护变量的一套规则",接下来是时候来深入讨论一下Js的作用域问题了,首先我们要知道作用域一般有两种主要的工作类型,一种是词法作用域,一种是 ...
- Qt写Activex插件 总结
最近写的插件功能基本完成,也遇到了一些坑,在这里记录一下. 我写的这个插件的js接口是仿造google earth的js接口,尽可能的达到与它的api一致.先从最简单的说起: 1. 导出接口中的flo ...
- Mini ORM——PetaPoco笔记
Mini ORM--PetaPoco笔记 记录一下petapoco官网博客的一些要点.这些博客记录了PetaPoco是如何一步步改进的. 目录: Announcing PetaPoco PetaPoc ...
- Mini ORM——PetaPoco笔记(转)
记录一下petapoco官网博客的一些要点.这些博客记录了PetaPoco是如何一步步改进的. 目录: Announcing PetaPoco PetaPoco-Improvements PetaPo ...
- Clojure上手
Clojure,这是什么鬼?一门基于JVM(现在也有基于.NET CLR的了:Clojure CLR) 的函数式编程语言.在JVM平台运行的时候,会被编译为JVM的字节码进行运算..为什么要学它?其设 ...
- JavaScript学习总结(二)
JavaScript学习总结(二) ---- 对象 在JavaScript中,几乎用到的每个js都离不开它的对象.下面我们深入了解一下js对象. js中对象的分类跟之前我们学过的语言中函数的分类一样, ...
- JavaScript学习总结 之对象
JavaScript学习总结(二) ---- 对象 在JavaScript中,几乎用到的每个js都离不开它的对象.下面我们深入了解一下js对象. js中对象的分类跟之前我们学过的语言中函数的分类一样, ...
- C++函数重载和函数模板(04)
函数重载 函数重载可以使一个函数名具有多种功能,即具有“多种形态”,这种特性称为多态性. C++的多态性又被直观地称为“一个名字,多个函数”.源代码只指明函数调用,而不说明具体调用哪个函数.编译器的这 ...
- 你不知道的JS之作用域和闭包(二)词法作用域
原文:你不知道的js系列 词法作用域(Lexical Scope) Lex time 一个标准的编译器的第一个阶段就是分词(token化) 词法作用域就是在词法分析时定义的作用域.换句话说,词法作用域 ...
随机推荐
- python datetime object 去除毫秒(microsecond)
>>>import datetime >>>d = datetime.datetime.now().replace(microsecond=0) >>& ...
- Android开发--Service和Activity通过广播传递消息
Android的Service也运行在主线程,但是在服务里面是没法直接调用更改UI,如果需要服务传递消息给Activity,通过广播是其中的一种方法: 一.在服务里面发送广播 通过intent传送数据 ...
- c/c++ 友元的简单应用
友元的简单应用 1,对象 + 对象,或者,对象 + 数字,可以用类的成员函数去重载+号函数,但是,数字 + 对象就不能用类的成员函数去重载+号函数了, 因为编译器会把数字 + 对象翻译成数字.oper ...
- 测试TCP 和 UDP 端口的方法
测试 TCP 端口: telnel IP PORT nc -vz IP PORT 测试 UDP 端口: nc -vuz IP PORT 其中 -u 表示使用 udp 协议来进行测试. -u, --ud ...
- MC9SD64单片机快速入门 I/O寄存器
I/O的使用 数据方向寄存器和数据寄存器的配置 I/O输入输出的使用: 数据方向寄存器与数据寄存器 寄存器的概念: 寄存器,是集成电路中非常重要的一种存储单元,通常由触发器组成.在集成电路设计中,寄存 ...
- 安装Window 10系统------计算机经验
为什么这次安装window10系统呢?不是和window7系统的安装方法一样么?如果你是这样的想的话,是不完全对的,因为window10系统的安装有些繁杂,需要耐心.下面我就准备了官方原版的windo ...
- sqli-labs安装
平台:Win7 SP1 需要准备的东西: 1. Sqli-labs ,下载地址: https://github.com/Audi-1/sqli-labs 2.phpstudy ...
- Spring的AOP基于AspectJ的注解方式开发2
参考自黑马培训机构 上一篇博客提到了在配置文件中开启aop的注解开发,以及简单使用了@Before,@Aspect 这是为了告诉spring为前置通知和切面类 接下来介绍aop的注解的通知类型,和切入 ...
- Python开发【第二篇】:基本数据类型
运算符 1.算数运算 2.比较运算 3.赋值运算 4.逻辑运算 5.成员运算 基本数据类型 所有对象所具备的方法都保存在类中.对象和类的关系,举个例子:哺乳动物是类:此类下有两个对象,一个为狗.一个为 ...
- Nginx 安装配置
Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. ...