因为IDictionaryResolver和ICollectionResolver中定义的足够抽象的规则,Bssom.Net不需要为未来.NET可能出现的新的IDictionary或IColloction实现而编写特定的解析代码.
在Bssom.Net中可以通过BssomSerializerOptions中的FormatterResolver属性来注入序列化所需要的解析器, 默认为CompositedResolver, CompositedResolver将会对类型依次从 Object,Primitive,Attribute,BssomValue,BuildIn,IDictionary,ICollection,MapCodeGen解析器中进行查找, 直到找到对应的解析器.
5.扩展让我们看一下Bssom.Net序列化的过程:
input T -> Call serialize(T) -> Find BssomResolver -> Provide type formatter -> formatter.Serialize(T);在整个序列化的过程中, 每个步骤都是透明的, 这意味着若用户对Bssom.Net内部定义的解析器或格式化器不满意的话, 则可以自己扩展它.
用户可以自己通过实现IFormatterResolver和IBssomFormatter来替代默认的解析器, 在Bssom.Serializer.Binary.BssomBinaryPrimitives(在即将到来的小版本中将重构该类)和读写器本身所暴露的公开API中提供对Bssom格式的低级写入和读取实现.
简单示例可以参考
6.高级API BssomSerializerBssomSerializer是Bssom最上层的API, 在Bssom.Serializer命名空间下, 是Bssom开始工作的入口. 它的静态方法构成了Bssom.Net的主要API.
API 描述 重载Size 在不进行序列化的情况下, 获取对象被序列化后的二进制数据大小 (t, option),(ref context, t)
Serialize 将给定的值序列化为Bssom二进制 (byte[], t, option), (stream, t, option), (IBssomBufWriter, t, option), (ref context, t)
Deserialize 将Bssom二进制数据反序列化成.net对象 (byte[], option),(stream, option),(IBssomBuf, option),(ref context)
SerializeAsync 异步的序列化给定的值为Bssom二进制 同上
DeserializeAsync 异步的将Bssom二进制数据反序列化成.net对象 同上
BssomSerializerOptions
BssomSerializer作为最上层的API,我们在调用它时,需要传递一个可空的BssomSerializerOptions类型的Option参数.
BssomSerializerOptions是Bssom在整个序列化工作期间所需要使用的配置. 默认为BssomSerializerOptions.Default.
FormatterResolver : 在Option中,你可以为FormatterResolver注册解析器, 如果没有手动注册, 则使用默认的CompositedResolver, Bssom将总是通过FormatterResolver来对类型进行解析.
Security : 这是用于序列化期间的安全相关选项, 目前仅提供了在反序列化期间对深度的验证,默认为 不限制
IsPriorityToDeserializeObjectAsBssomValue : 该选项决定了反序列化时是否将Object类型转换为BssomValue类型, 如果为false, 则默认反序列化为原生类型. 默认为false.
IsUseStandardDateTime : Bssom.Net对DateTime类型实现了标准的Bssom协议Unix格式 和 .NET平台的本地格式, 本地格式具有更少的字节, 但不具备和其它平台的交互性, 默认为false.
IDictionaryIsSerializeMap1Type : 此选项决定了对具有IDictionary行为的类型默认使用哪种格式进行序列化, 如果为true则使用Map1格式, 否则为Map2格式. 默认为true
BssomSerializeContextBssomSerializeContext提供了序列化期间所使用的上下文信息, 这其中也包括了BssomSerializerOptions
BssomSerializerOptions : 序列化期间所使用的配置信息
ContextDataSlots : 提供了一个数据槽, 供用户在序列化期间自己存储和读取的一个存储介质
CancellationToken : 一个序列化操作取消的标记, 用户可以中途取消正在进行的序列化操作
7.字段编组