NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。
整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。
开源地址:https://github.com/NewLifeX/X (求star, 864+)
XCode是充血模型,在实体类上附带有大量便捷操作,其中就包括各种目标数据类型的导入导出!
Json序列化
当下最常用的数据通信格式毋容置疑肯定是Json,实体对象可直接转Json作为接口返回值。
下面看看一个普通Role实体对象的Json序列化(ToJson)和Json反序列化(ToJsonEntity)的例程和效果。
如上,Role实体对象可通过ToJson转为json字符串,并通过ToJsonEntity把字符串转为另一个Role实体对象。
在XCode v9.0之前,实体基类Entity直接带有ToJson/FromJson。后来因为Json实在太常用了,提升为全局扩展方法。
Json作为最通用的数据传输格式(没有之一),ToJson直接扩展Object,有三个参数:是否换行缩进、是否写空值、是否驼峰命名
上文示例中的ToJson(true, false, false)表示采用换行缩进(可读性更好),不写空值(整数的0和字符串的null等),不适用驼峰命名。
Xml序列化
Xml作为曾经的数据传输格式之王,仍然有相当一部分古老接口使用。
ToXml/ToXmlEntity 也是全局扩展方法,其中参数可以控制序列化为普通Xml或者Xml属性。
从结果来看,Xml可读性非常好,但是占用空间很大,一般比Json还要大一截。
二进制序列化
XCode序列化的绝招是二进制序列化,能够让实体对象和二进制数据互相转换,更小、更快!
序列化同样的实体对象,只需要39字节,远小于Json和Xml,并且速度更快(不需要字符串分割操作)。
实体对象没有ToBinary之类的快速方法,而是需要先转化为IAccessor接口,然后Write序列化为数据流,或者Read读取数据流。
数据流是个好东西,最常用的有内存流、文件流、网络流、加密流、压缩流,等等等。
文件流FileStream,可以让实体对象保存为文件,或者文件加载为实体对象,(借助文件缓存实体数据?);
网络流NetworkStream,可以让实体对象在网络中传输;
IAccessor 访问器接口,可实现任意对象到数据流的读写访问。
NewLife.Redis 优先支持 IAccessor 接口,因此,把XCode实体对象写入Redis时,采用的是二进制高效精简格式,而不是默认的Json格式。
实体类可通过重载 OnWrite 来自定义二进制序列化的行为。
/// <summary>二进制序列化到数据流</summary> /// <param>数据流</param> /// <param>上下文</param> /// <param>是否序列化扩展属性</param> protected virtual Boolean OnWrite(Stream stream, Object context, Boolean extend) { var bn = context as Binary; if (bn == null) bn = new Binary { Stream = stream, EncodeInt = true }; var fs = extend ? Meta.AllFields : Meta.Fields; foreach (var fi in fs) { bn.Write(this[fi.Name], fi.Type); } return true; }