实体类的二进制序列化
时间:2022-04-28
本文章向大家介绍实体类的二进制序列化,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在.NET中,我们可以将对象序列化从而保存对象的状态到内存或者磁盘文件中,或者分布式应用程序中用于系统通信,一般来说,二进制序列化的效率要高,所获得的字节数最小,我们来看看下面的例子:
private static void Main(string[] args)
{
MemoryStream ms = null;
Customer customer = Customer.GetOneCustomer();
using (ms = new MemoryStream())
{
var formater = new BinaryFormatter();
formater.Serialize(ms, customer);
Console.WriteLine("BinaryFormatter Length:{0}", ms.Length);
}
using (ms = new MemoryStream())
{
var serializer = new XmlSerializer(typeof (Customer));
serializer.Serialize(ms, customer);
Console.WriteLine("XmlSerializer Length:{0}", ms.Length);
}
PDF.NET(PWMIS数据开发框架)的实体类也提供了二进制序列化功能,下面我们来演示一下它的使用:
//PDF.NET 实体类序列化、反序列化测试
Customer customer = new Customer();
customer.CustomerBirthday = new DateTime(1999, 1, 1);
customer.CustomerName = "张三";
customer.CustomerMobile = "13011111111";
//序列化
byte[] buffer= PdfNetSerialize.BinarySerialize(customer);
string tempString= Convert.ToBase64String(buffer);
//反序列化
byte[] buffer2 = Convert.FromBase64String(tempString);
//WFT_Customer customer2=(WFT_Customer) PdfNetSerialize.BinaryDeserialize(buffer2, typeof(WFT_Customer));
Customer customer2 = GetEntity<Customer>(buffer2);
上面的例子使用了Base64来将序列化后的字节数组转换成字符串,从而利于使用。如果想将二进制字节数组转直接换成字符串,可以使用具有8位编码的字符集转换,但不能使用其它字符集,比如Unicode、GB2312.
public string ConvertToString(object targetObject){
//ISO8859-1 字符串,8位,只有这种可以完整保留二进制
Encoding _encoding = Encoding.GetEncoding(28591);
byte[] buffer= PdfNetSerialize.BinarySerialize((EntityBase)targetObject);
return _encoding.GetString(buffer);
}
为了更通用,定义了一个GetEntity泛型方法,从二进制字节流反序列化获得一个实体类:
T GetEntity<T>(byte[] buffer ) where T:EntityBase
{
return (T)PdfNetSerialize.BinaryDeserialize(buffer, typeof(T));
}
所以,PDF.NET框架的序列化功能使用很简单,而且也有很高的效率。利用二进制序列化,可以将一个实体对象集合持久化到磁盘,这样就有可能做出一个“对象数据库”了。
- 挑战数据结构和算法面试题——左旋转字符串
- 聚簇因子和执行计划的联系(r3笔记第90天)
- Global eval. What are the options?
- 3d效果的图片轮播
- 关于等待事件"read by other session"(r3笔记第89天)
- URI编码解码和base64
- 阿里大数据竞赛第一名大神github源代码分享(O2O优惠券使用预测)
- 关于导入dump(r3笔记第98天)
- DOM 节点的克隆与删除
- 异步Promise实现
- 《数学之美》拾遗——TF-IDF
- javascript URL实现简易书签
- 爬取淘宝/天猫评论数据的过程
- 通过shell分析表依赖的层级关系(r3笔记第97天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel 连接(Join)示例
- 解决Laravel自定义类引入和命名空间的问题
- 详解Laravel服务容器的绑定与解析
- 修改Laravel自带的认证系统的User类的命名空间的步骤
- PHP使用递归按层级查找数据的方法
- Laravel6.2中用于用户登录的新密码确认流程详解
- PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
- 浅谈PHP array_search 和 in_array 函数效率问题
- 仿抖音短视频APP源码,实现简单的换头像并保存
- php实现JWT(json web token)鉴权实例详解
- laravel实现上传图片,并且制作缩略图,按照日期存放的代码
- 在Laravel中使用MongoDB的方法示例
- 基于thinkphp6.0的success、error实现方法
- Yii框架模拟组件调用注入示例
- 解决laravel 表单提交-POST 异常的问题