折腾 HoconDeserializer 的第三天,还在想怎么能够用一个比较快速的把一个类型上放的那堆 attribute 转换成便于比较通用地反序列化函数处理的形式……
* HOCON 是类似 JSON 的配置文件格式,可以转换成一个 dictionary 或者 list。在现阶段,反序列化时需要处理的类型是 HoconValue
** 当前咱定义了几种类型用来保存反序列化需要的数据:
- HoconConfigAttribute,指示这个类可以被反序列化
- HoconNodeAttribute,指示可以被反序列化的 field 或者 property 以及可能需要的转换函数
- IHoconDeserializable,指示这个类内部写了自定义的从 HOCON 反序列化的方法
现在想到的最好的方法是:
1. 在第一次遇到这个类型的时候读取所有 attribute 数据
2. 读取类型 (Type, HoconConfigAttribute) 和它所有带 attribute 的 field (FieldInfo, HoconNodeAttribute) 和 property (PropertyInfo, HoconNodeAttribute) 的信息,还有这些 field 和 property 所对应的键名
3. 对于每一个键名,找出它所需要用的反序列化函数(attribute 里面定义的最优先,其次如果全局注册过了用全局的,最后还没有的话判断类型有没有实现 IHoconDeserializable 接口,都没有的话报错)
4. 把以上所有信息保存到一个 cache,向另一个 cache 保存下面的反序列化函数
5. 每次碰到需要反序列化这个类型的场合,从 cache 找到这个类型的信息,对每个键执行反序列化函数,并把结果赋值给对象。
这里咱有几个问题
1. 这么做是不生成代码(像 protobuf 那样)的情况下的较优解么?
2. 反序列化函数的返回类型很可能是 object,对于大量值类型(这是 C#,所以还有各种 struct)装箱拆箱开销会不会有点大?可不可以干掉这个问题?
想到再补充
#咱太菜了
#折腾出来了一定要去写medium
消息来源: https://t.me/rynif/12932
* HOCON 是类似 JSON 的配置文件格式,可以转换成一个 dictionary 或者 list。在现阶段,反序列化时需要处理的类型是 HoconValue
** 当前咱定义了几种类型用来保存反序列化需要的数据:
- HoconConfigAttribute,指示这个类可以被反序列化
- HoconNodeAttribute,指示可以被反序列化的 field 或者 property 以及可能需要的转换函数
- IHoconDeserializable,指示这个类内部写了自定义的从 HOCON 反序列化的方法
现在想到的最好的方法是:
1. 在第一次遇到这个类型的时候读取所有 attribute 数据
2. 读取类型 (Type, HoconConfigAttribute) 和它所有带 attribute 的 field (FieldInfo, HoconNodeAttribute) 和 property (PropertyInfo, HoconNodeAttribute) 的信息,还有这些 field 和 property 所对应的键名
3. 对于每一个键名,找出它所需要用的反序列化函数(attribute 里面定义的最优先,其次如果全局注册过了用全局的,最后还没有的话判断类型有没有实现 IHoconDeserializable 接口,都没有的话报错)
4. 把以上所有信息保存到一个 cache,向另一个 cache 保存下面的反序列化函数
5. 每次碰到需要反序列化这个类型的场合,从 cache 找到这个类型的信息,对每个键执行反序列化函数,并把结果赋值给对象。
这里咱有几个问题
1. 这么做是不生成代码(像 protobuf 那样)的情况下的较优解么?
2. 反序列化函数的返回类型很可能是 object,对于大量值类型(这是 C#,所以还有各种 struct)装箱拆箱开销会不会有点大?可不可以干掉这个问题?
想到再补充
#咱太菜了
#折腾出来了一定要去写medium
消息来源: https://t.me/rynif/12932