二进制序列化与反序列化-Net理论篇下(一)

1. 总体的结构设计

思来想去还是没有画出自己想要的图来,姑且暂用这个吧,希望大侠见谅。首先我们需要一个窗口类以方便将内部实现和外部调用逻辑隔绝开,那么这里BsonConvert的地位自然就不言而喻的。 而具体操作它会委托给BsonSerializer去完成。BsonSerializer是一次序列化或者反序列化会话的起点。当每次会话开始,我们都需要实例化一个BsonSerializer的实例,而它的工作就是为每次会话准备充分:初始化一个二进制数据池,创建读写管道BsonWriter和BsonReader,同时生成BsonContract根协议。之后工作的中心转交到BsonContract,BsonContract会委托ConverterFactory工场去创建需要的类型转换器IBsonConverter,并接手数据池和读写同道控制转换器完成对某个特定类型实例的序列化和反序列化工作。而IBsonConverter会实现对具体某个类型的实例数据的序列化和反序列化以及最终的读写操作。

2. 约束和规范

正所谓没有规矩不成方圆,所以这里有必要简述下我们需要的二进制序列化和反序列化的约束和范围。首先我们需要一个二进制序列化和反序列化支持如下主要特性:

1)         支持所有NET基元类型。

2)         支持常用集合类,如Array,List<>,Dictionary<,>,Collection<>。

3)         支持简单自定义类型。

当然也有所约束:

1)         只支持自定义类公共属性序列化

2)         只支持无参构造自定义类型。

3)         不支持接口和抽象类的序列化和反序列化

4)         不支持object元素泛型集合类的序列化和反序列的处理

对于以上约束,第二和三点很好理解,其实大家都没有未卜先知的本领,类库没办法知道你反序列化的实例的构造函数需要哪些参数以及你需要实例化的子类。就像朋友生日送礼盒,只有送的人知道里面是什么,生日的朋友在你不说明的情况下,一般不会知道这个,所以叫惊喜,当然这里就是惊吓了。对于第四点,其实是自己目前没有找到更好的办法,更准确的说它是一个缺陷而非约束。

3. 核心的接口定义

在有了设计和约束,那么需要来定义一个比较核心的接口,那就是IBsonConverter。正如上面介绍的那样,这是一个转换器接口,其作用就是讲某个类型转换成我们想要的过程并能够还原成原来的类型,如将int类型转化为byte或者从byte还原为int类型。

首先是Write(BsonWriter,BsonContract, Type, Object,BsonSettings)

BsonWriter是数据写同道,通过它我们可以将数据顺序写入数据池中,同时它支持常见的基础数据类型的转化工作。BsonContract是元数据描述类,它可以协助转化器完成一些比较特殊的行为,Type是目标类型描述数据,Object是目标实例,BsonSettings主要控制外部自定义的设置,主要正对一些全局性设置。

而Object Read(BsonReader,BsonContract,Type,BsonSettings)

Read正好跟Write作用相反,从二进制还原成原来的类型实例,BsonReader是数据的读同道,其他参数与上面相同。

 

4. 基本类型转化途径

转载于:https://www.cnblogs.com/windsinger77/p/3843564.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值