[NewLife.XCode]导入导出(实体对象百变魔君)
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 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抽取,调度计算处理,结果持久化
[NewLife.XCode]导入导出(实体对象百变魔君)的更多相关文章
- [NewLife.XCode]分表分库(百亿级大数据存储)
NewLife.XCode是一个有15年历史的开源数据中间件,支持netcore/net45/net40,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量 ...
- PowerDesigner数据库设计PDM基于Excel的导入导出总结
经常用到pdm来管理代码,一两张表,手写一下还凑合,一旦表多了,就慌了.于是,开始学习用vbs进行Excel的来快速导入导出操作PDM就变得很紧急了,搜罗了网络上的很多vbs脚本,各有各的优点,但对于 ...
- [NewLife.XCode]实体列表缓存(最土的方法实现百万级性能)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...
- [NewLife.XCode]实体类详解
NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...
- [NewLife.XCode]百亿级性能
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...
- [NewLife.XCode]实体工厂(拦截处理实体操作)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...
- LOB对象在数据泵导出、导入后查询对象数量发现丢失
问题描述:问题:源库的某个Schema使用数据泵Expdp元数据整体导出,在目标库导入且成功后,逻辑验证用户对象,发现缺失.分析查询后,缺失的对象,都是LOB类型(并不是所有的LOB都无法导入,是大部 ...
- sql developer Oracle 数据库 用户对象下表及表结构的导入导出
Oracle数据库表数据及结构的导入导出 导出的主机与即将导入到的目标主机的tablespace 及用户名需一直!!!!!
- [NewLife.XCode]数据模型文件
NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...
随机推荐
- 通过yum在centos安装mysql并配置远程登录
前言 前天按照Oracle上的文档装了一遍mysql,选了最新8.0的版本,后来出现一些问题,网上搜答案,出来的基本还是5.x版本的解决方案,并不适用8.0版本.然后我就去看了一下公司的正式环境买的阿 ...
- golang--海量用户即使通讯系统
功能需求: 用户注册 用户登录 显示在线用户列表 群聊 点对点聊天 离线留言
- Hbase内存磁盘大致关系
转自: https://blog.csdn.net/wuwenxiang91322/article/details/51595771 Hbase内存磁盘关系磁盘数 diskNum磁盘容量 diskCa ...
- CSP-S 爆零记
抱歉,这么晚才更. 事实是:我都没有去 所以爆零了 QwQ
- 适合初学者的Python爬取链家网教程
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: TinaLY PS:如有需要Python学习资料的小伙伴可以加点击下 ...
- 一个小事例,了解golang通道阻塞模式
在学习golang中,channel真的是让人捉摸不透的东西,本来我自以为我理解了协程阻塞的用法了,结果就下面这个小例子,我还是在打印输出后才搞明白到底怎么回事? 当然了,这也是我自身对协程这块不太熟 ...
- Linux网络——修改配置文件
Linux网络——修改配置文件 摘要:本文主要学习了如何通过修改配置文件来设置网络参数. 配置文件 通过修改系统的配置文件为系统设置网络参数,这种方式的优点是可以永久保存,计算机重启后仍然生效.缺点是 ...
- LinuxShell脚本——函数
LinuxShell脚本——函数 摘要:本文主要学习了Shell中函数的定义和使用. 函数的定义 Shell函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接 ...
- Python【day 14-3】二分法查找
#二分法查找 #方法1 循环+左右边界变动,两者差减半 #方法2 递归+新列表长度减半 #方法3 递归+左右边界变动,两者差减半 #方法1 循环+左右边界变动,两者差减半 def recursion1 ...
- ADB控制手机命令(adb命令)
手机端配置tcp方式连接 su setprop service.adb.tcp.port 5555 stop adbd start adbd 首先使用管理员权限,然后打开监听5555端口 电脑端使用a ...