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版]

  1. 增删改查入门。快速展现用法,代码配置连接字符串
  2. 数据模型文件。建立表格字段和索引,名字以及数据类型规范,推荐字段(时间,用户,IP)
  3. 实体类详解。数据类业务类,泛型基类,接口
  4. 功能设置。连接字符串,调试开关,SQL日志,慢日志,参数化,执行超时。代码与配置文件设置,连接字符串局部设置
  5. 反向工程。自动建立数据库数据表
  6. 数据初始化。InitData写入初始化数据
  7. 高级增删改。重载拦截,自增字段,Valid验证,实体模型(时间,用户,IP)
  8. 脏数据。如何产生,怎么利用
  9. 增量累加。高并发统计
  10. 事务处理。单表和多表,不同连接,多种写法
  11. 扩展属性。多表关联,Map映射
  12. 高级查询。复杂条件,分页,自定义扩展FieldItem,查总记录数,查汇总统计
  13. 数据层缓存。Sql缓存,更新机制
  14. 实体缓存。全表整理缓存,更新机制
  15. 对象缓存。字典缓存,适用用户等数据较多场景。
  16. 百亿级性能。字段精炼,索引完备,合理查询,充分利用缓存
  17. 实体工厂。元数据,通用处理程序
  18. 角色权限。Membership
  19. 导入导出。Xml,Json,二进制,网络或文件
  20. 分表分库。常见拆分逻辑
  21. 高级统计。聚合统计,分组统计
  22. 批量写入。批量插入,批量Upsert,异步保存
  23. 实体队列。写入级缓存,提升性能。
  24. 备份同步。备份数据,恢复数据,同步数据
  25. 数据服务。提供RPC接口服务,远程执行查询,例如SQLite网络版
  26. 大数据分析。ETL抽取,调度计算处理,结果持久化

[NewLife.XCode]导入导出(实体对象百变魔君)的更多相关文章

  1. [NewLife.XCode]分表分库(百亿级大数据存储)

    NewLife.XCode是一个有15年历史的开源数据中间件,支持netcore/net45/net40,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量 ...

  2. PowerDesigner数据库设计PDM基于Excel的导入导出总结

    经常用到pdm来管理代码,一两张表,手写一下还凑合,一旦表多了,就慌了.于是,开始学习用vbs进行Excel的来快速导入导出操作PDM就变得很紧急了,搜罗了网络上的很多vbs脚本,各有各的优点,但对于 ...

  3. [NewLife.XCode]实体列表缓存(最土的方法实现百万级性能)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  4. [NewLife.XCode]实体类详解

    NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...

  5. [NewLife.XCode]百亿级性能

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  6. [NewLife.XCode]实体工厂(拦截处理实体操作)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  7. LOB对象在数据泵导出、导入后查询对象数量发现丢失

    问题描述:问题:源库的某个Schema使用数据泵Expdp元数据整体导出,在目标库导入且成功后,逻辑验证用户对象,发现缺失.分析查询后,缺失的对象,都是LOB类型(并不是所有的LOB都无法导入,是大部 ...

  8. sql developer Oracle 数据库 用户对象下表及表结构的导入导出

    Oracle数据库表数据及结构的导入导出   导出的主机与即将导入到的目标主机的tablespace 及用户名需一直!!!!!

  9. [NewLife.XCode]数据模型文件

    NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...

随机推荐

  1. 隐马尔可夫模型(HMM)及Viterbi算法

    HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引入该模型 ...

  2. css的伪元素 ::after ::before 和 图标字体的使用

    浅谈css的伪元素::after和::before   css中的::after和::before已经被大量地使用在我们日常开发中了,使用他们可以使我们的文档结构更加简洁.但是很多人对::after和 ...

  3. Docker学习——Dockerfile

    上一篇我们讲了docker的基本使用,掌握了前一篇,docker使用基本不成问题,但是要是你学习了Dockerfile,你会发现它使用起来有多方便了.项目最终部署时,我们希望docker容器打开时项目 ...

  4. Linux中Swap与Memory内存简单介绍

    1.背景介绍   这篇文章介绍一下Linux中swap与memory.对于memory没什么可说的就是机器的物理内存,读写速度低于cpu一个量级,但是高于磁盘不止一个量级.所以,程序和数据如果在内存的 ...

  5. ASP.NET Core 如何用 Cookie 来做身份验证

    前言 本示例完全是基于 ASP.NET Core 3.0.本文核心是要理解 Claim, ClaimsIdentity, ClaimsPrincipal,读者如果有疑问,可以参考文章 理解ASP.NE ...

  6. Linux - 几种方法来实现scp拷贝时无需输入密码

    前言 在实际工作中,经常会将本地的一些文件传送到远程的机器上.scp是一个很好用的命令,缺点是需要手工输入密码. 如何在shell脚本中实现传输文件,而不用手工输入密码呢?接下来介绍三种方法. 一.建 ...

  7. c# winfrom 更新控件时停止刷新,解决闪烁问题

    static Dictionary<Control, bool> m_lstFreezeControl = new Dictionary<Control, bool>(); / ...

  8. 练手WPF(三)——扫雷小游戏的简易实现(下)

    十四.响应鼠标点击事件    (1)设置对应坐标位置为相应的前景状态 /// <summary> /// 设置单元格图样 /// </summary> /// <para ...

  9. springmvc学习笔记二:重定向,拦截器,参数绑定

    Controller方法返回值 返回ModelAndView controller方法中定义ModelAndView对象并返回,对象中可添加model数据.指定view. 返回void 在Contro ...

  10. JS基础语法---do-while循环 + 总结while循环和do-while循环

    1. 总结:while循环和do-while循环 while循环特点:先判断,后循环,有可能一次循环体都不执行 do-while循环特点:先循环,后判断,至少执行一次循环体   对比体会:   1.  ...