实体类的二进制序列化

在.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(199911);
            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框架的序列化功能使用很简单,而且也有很高的效率。利用二进制序列化,可以将一个实体对象集合持久化到磁盘,这样就有可能做出一个“对象数据库”了。

 

posted on   深蓝医生  阅读(1767)  评论(4编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

导航

< 2011年5月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 1 2 3 4
5 6 7 8 9 10 11
点击右上角即可分享
微信分享提示