实体类的二进制序列化

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

EnterLib PIAB又一个BUG?[续]——这是一个致命的BUG

在《EnterLib PIAB又一个BUG?》这篇文章中我们谈到:当我们通过应用DependencyAttribute特性定义需要自动注入的属性的时候,当这个属...

2429
来自专栏逸鹏说道

【推荐】C#线程篇---Task(任务)和线程池不得不说的秘密(5.1)

在上篇最后一个例子之后,我们发现了怎么去使用线程池,调用ThreadPool的QueueUserWorkItem方法来发起一次异步的、计算限制的操作,例子很简单...

4545
来自专栏逸鹏说道

【推荐】C#线程篇---Task(任务)和线程池不得不说的秘密(5.2)

ContinueWith? 啥东西~~??  要写可伸缩的软件,一定不能使你的线程阻塞。这意味着如果调用Wait或者在任务未完成时查询Result属性,极有...

4386
来自专栏码农阿宇

用.Net Core控制台模拟一个ASP.Net Core的管道模型

在我的上几篇文章中降到了asp.net core的管道模型,为了更清楚地理解asp.net core的管道,再网上学习了.Net Core控制台应用程序对其的模...

2799
来自专栏程序员互动联盟

【专业技术】反射技术探究

反射 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象...

3306
来自专栏小樱的经验随笔

Codeforces 714A Meeting of Old Friends

A. Meeting of Old Friends time limit per test:1 second memory limit per test:256...

38410
来自专栏令仔很忙

面向对象编程实例

上一篇博客主要是在理论上介绍面向对象编程,下面通过一个计算器的实例来学习面向对象的好处。

1741
来自专栏Python小屋

Python版归并排序算法(附Python程序__name__属性用法演示视频)

import random def mergeSort(seq, reverse=False): #把原列表分成两部分 mid = len(s...

3366
来自专栏领域驱动设计DDD实战进阶

05-TypeScript中的方法新功能(下)

再TypeScript中,方法还有一些新功能能够让我们更好的控制方法执行。 1.Generator方法: yield关键字用于控制方法在执行的时候暂停住,后续方...

2805
来自专栏Python

Django--admin源码流程

admin.py from django.contrib import admin from . import models """ 通过原生的django a...

3018

扫码关注云+社区

领取腾讯云代金券