包序列化模式
定义
命名空间:TouchSocket.Core
程序集:TouchSocket.Core.dll
一、说明
包序列化模式是为了解决极限序列化的问题。常规序列化的瓶颈,主要是反射、表达式树、创建对象等几个方面,这几个问题在运行时阶段,都没有一个好的解决方案。目前在net6以后,微软大力支持源生成,这使得这类问题得到了很大程度的解决。但是对于老项目,或者无法使用net6和vs2022以上的项目,是无法使用的。所以,这时候包序列化模式就显得非常需要了。
二、特点
2.1 优点
- 简单、可靠、高效
- 可以支持所有类型(需要自己编写代码)
- 数据量最少(从理论来说这是占数据量最轻量的设计)
2.2 缺点
- 在源生成无法使用时,手动编写代码比较麻烦。
- 不支持跨语言。
- 类型版本兼容性比较差,简单来说就是高版本只能新增属性,不能删除属性,不能修改属性类型(如果类型长度一致,则可以修改类型,例如:
int
->float
)。
三、使用
3.1 简单类型
例如:
下列类型MyClass,有一个Int类属性和一个string类属性。
public class MyClass
{
public int P1 { get; set; }
public string P2 { get; set; }
}
我们可以使用包序列化模式,将MyClass序列化成二进制流,或者反序列化成MyClass。
那么首先需要实现IPackage接口(或者继承PackageBase),然后依次将属性写入到ByteBlock中,或者从ByteBlock中读取属性。
public class MyClass:PackageBase
{
public int P1 { get; set; }
public string P2 { get; set; }
public override void Package<TByteBlock>(ref TByteBlock byteBlock)
{
//将P1与P2属性按类型依次写入
byteBlock.WriteInt32(this.P1);
byteBlock.WriteString(this.P2);
}
public override void Unpackage<TByteBlock>(ref TByteBlock byteBlock)
{
//将P1与P2属性按类型依次读取
this.P1 = byteBlock.ReadInt32();
this.P2 = byteBlock.ReadString();
}
}