NewLife.XCodeは、オープンソースのミドルウェアの10年の歴史あるデータ、サポートNFX / netcore、チーム新生活(2019年から2002年)を開発し、これまで維持し、以下のXCodeと呼ばれます。
このシリーズは、サンプルコードと実行ログで詳細な分析に実質的に接続されますを通じて、それがリアルタイムシステムのプロジェクトに百億ビッグデータの代表での開発経験の多くの年が含まれています。
オープンソースアドレス:https://github.com/NewLifeX/X (864+、スターを請います)
XCodeの充血モデル、対象データのインポートとエクスポートの様々なタイプを含む便利な操作の数が多い、中に含まれるエンティティクラス!
JSONシリアライズ
現在最も一般的なデータ通信フォーマットは確か固体オブジェクトが戻り値としてインターフェースJSONに直接転送することができる疑いJSON、です。
一般的にJSONシリアライズ(toJSON)とJSONデシリアライゼーション(ToJsonEntity)ルーチンと効果以下の役割エンティティ・オブジェクトを参照してください。
上記、役割のJSON文字列はToJsonによりソリッドオブジェクトに変換され、別の文字列ToJsonEntity役割エンティティオブジェクトを介してすることができます。
XCodeのはV9.0、エンティティを直接ToJson / FromJsonと基底クラスのエンティティの前に。その後、JSON、あまりにも一般的な理由は、グローバル拡張メソッドへ。
最も一般的なデータ伝送フォーマットとして、JSON(誰)、ToJson直接拡張オブジェクト、三つのパラメータがある:新しい行のインデントするかどうか、キャメルケースかどうかを、ヌル値を書き込むかどうか
ToJson上記の例(TRUE、FALSE、偽)は改行インデント(読みやすくする)を用いて発現、(等ヌル0及び整数列)ヌルを書き込まない、NA camelCasing形式。
XMLシリアル化
かつての王のXmlのデータ伝送フォーマットとしては、まだ古いインターフェースのかなりの部分があります。
制御パラメータは、正常またはXML XMLプロパティにシリアル化することができるToXml / ToXmlEntityグローバル拡張方法。
結果からはXMLの読みやすさは非常に良いですが、JSONの長さよりも大きなスペースは、一般的に大きな。
バイナリシリアル
XCode序列化的绝招是二进制序列化,能够让实体对象和二进制数据互相转换,更小、更快!
序列化同样的实体对象,只需要39字节,远小于Json和Xml,并且速度更快(不需要字符串分割操作)。
实体对象没有ToBinary之类的快速方法,而是需要先转化为IAccessor接口,然后Write序列化为数据流,或者Read读取数据流。
数据流是个好东西,最常用的有内存流、文件流、网络流、加密流、压缩流,等等等。
文件流FileStream,可以让实体对象保存为文件,或者文件加载为实体对象,(借助文件缓存实体数据?);
网络流NetworkStream,可以让实体对象在网络中传输;
IAccessor 访问器接口,可实现任意对象到数据流的读写访问。
NewLife.Redis 优先支持 IAccessor 接口,因此,把XCode实体对象写入Redis时,采用的是二进制高效精简格式,而不是默认的Json格式。
实体类可通过重载 OnWrite 来自定义二进制序列化的行为。
/// <summary>二进制序列化到数据流</summary> /// <param name="stream">数据流</param> /// <param name="context">上下文</param> /// <param name="extend">是否序列化扩展属性</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; }
从上面代码可以看出,只是调用二进制序列化Binary来把各个数据字段写入流中。
看到这里,你是不是有很多可以大干一场的想法?别急,这只是开胃菜,还有更好的。
示例中看到,二进制序列化最大缺点是可读性极差!一般只能看到其中部分字符串。
实体列表存储
单个实体对象的二进制序列化只适用于简单场合,如写入Redis,实际工程级应用,多以实体列表为主。
实体列表存储以扩展方法提供:
- Write,写入实体列表到数据流
- Read,从数据流加载实体列表
- SaveFile,保存实体列表到文件(可用作数据缓存)
- LoadFile,从文件加载实体列表
以上示例演示了具有4个对象的角色列表如果读写数据流以及文件。
有朋友要问,能否借助实体列表读写文件的功能,实现某些数据表的本地化缓存,即使数据库宕机,仍然能够继续提供服务?
答案显然是可以的,并且我在实际工作中也经常这么干。
数据分析中经常需要用到几十上百台服务器进行分析计算,应用启动时必须把配置数据和常用基础数据一次性载入内存,例如几万行的网点数据;
如果几十个节点同时启动向数据库请求网点数据,数据库将不堪重负变得非常缓慢,影响计算应用的加载甚至可能导致出错退出;
这种场景,可以在加载一次后,把实体列表数据保存到本地文件中,然后定时(10分钟)更新;
下次启动时,直接使用本地缓存数据,大大提升了应用启动速度,并且降低了数据库负担;
Csv导入导出
Csv格式常用于办公室Excel数据传递,以及数据库数据导入导出等。
XCode支持百万级导出!内部 CsvFile 支持流式读写,一边构造一边写入文件,而不是一次性在内存生成好再写入!
魔方的 Excel导出、Csv导出、Json导出、Xml导出等功能,都由 XCode 实现!
系列教程
NewLife.XCode教程系列[2019版]
- 增删改查入门。快速展现用法,代码配置连接字符串
- 数据模型文件。建立表格字段和索引,名字以及数据类型规范,推荐字段(时间,用户,IP)
- 实体类详解。数据类业务类,泛型基类,接口
- 功能设置。连接字符串,调试开关,SQL日志,慢日志,参数化,执行超时。代码与配置文件设置,连接字符串局部设置
- 反向工程。自动建立数据库数据表
- 数据初始化。InitData写入初始化数据
- 高级增删改。重载拦截,自增字段,Valid验证,实体模型(时间,用户,IP)
- 脏数据。如何产生,怎么利用
- 增量累加。高并发统计
- 事务处理。单表和多表,不同连接,多种写法
- 扩展属性。多表关联,Map映射
- 高级查询。复杂条件,分页,自定义扩展FieldItem,查总记录数,查汇总统计
- 数据层缓存。Sql缓存,更新机制
- 实体缓存。全表整理缓存,更新机制
- 对象缓存。字典缓存,适用用户等数据较多场景。
- 百亿级性能。字段精炼,索引完备,合理查询,充分利用缓存
- 实体工厂。元数据,通用处理程序
- 角色权限。Membership
- 导入导出。Xml,Json,二进制,网络或文件
- 分表分库。常见拆分逻辑
- 高级统计。聚合统计,分组统计
- 批量写入。批量插入,批量Upsert,异步保存
- 实体队列。写入级缓存,提升性能。
- 备份同步。备份数据,恢复数据,同步数据
- 数据服务。提供RPC接口服务,远程执行查询,例如SQLite网络版
- 大数据分析。ETL抽取,调度计算处理,结果持久化