序列化,又称为串行化,是.NET运行时环境用来支持用户定义类型的流行的机制。序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。

1、.NET支持的对象序列化的几种方式。

二进制序列化:对象序列化之后是二进制形成的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。

SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的。

XML序列化:对象序列化之后的结果是XML形式的,通过XmlSerializer 类来实现的,这个类位于System.Xml.Serialization命名空间下。XML序列化不能序列化私有数据。

2、几种序列化的区别

二进制格式和SOAP格式可序列化一个类型的所有可序列化字段,不管它是公共字段还是私有字段。XML格式仅能序列化公共字段或拥有公共属性的私有字段,未通过属性公开的私有字段将被忽略。使用二进制格式序列化时,它不仅是将对象的字段数据进行持久化,也持久化每个类型的完全限定名称和定义程序集的完整名称(包括包称、版本、公钥标记、区域性),这些数据使得在进行二进制格式反序列化时亦会进行类型检查。SOAP格式序列化通过使用XML命名空间来持久化原始程序集信息。而XML格式序列化不会保存完整的类型名称或程序集信息。这便利XML数据表现形式更有终端开放性。如果希望尽可能延伸持久化对象图的使用范围时,SOAP格式和XML格式是理想选择。

3、使用特性对序列化的控制

要让一个对象支持.Net序列化服务,用户必须为每一个关联的类加上[Serializable]特性。如果类中有些成员不适合参与序列化(比如:密码字段),可以在这些域前加上[NonSerialized]特性。

4、使用二进制序列化和反序列化

   二进制序列化与反序列化的程序示例[Serializable]  //必须添加序列化特性public class Person{private string Name;//姓名private bool Sex;//性别,是否是男public Person(string name, bool sex){this.Name = name;this.Sex = sex;}public override string ToString(){return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");}}[Serializable]  //必须添加序列化特性public class Programmer : Person{private string Language;//编程语言public Programmer(string name, bool sex, string language) : base(name, sex){this.Language = language;}public override string ToString(){return base.ToString() + "\t编程语言:" + this.Language;}}class Program{static void Main(string[] args){//创建Programmer列表,并添加对象List<Programmer> list = new List<Programmer>();list.Add(new Programmer("李志伟", true, "C#"));list.Add(new Programmer("Coder2", false, "C++"));list.Add(new Programmer("Coder3", true, "Java"));//使用二进制序列化对象string fileName = @"D:\users\lizw\桌面\Programmers.dat";//文件名称与路径Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器binFormat.Serialize(fStream, list);//使用二进制反序列化对象list.Clear();//清空列表fStream.Position = 0;//重置流位置list = (List<Programmer>)binFormat.Deserialize(fStream);//反序列化对象foreach (Programmer p in list){Console.WriteLine(p);}Console.Read();}}

总结

使用二进制序列化,必须为每一个要序列化的的类和其关联的类加上[Serializable]特性,对类中不需要序列化的成员可以使用[NonSerialized]特性。
二进制序列化对象时,能序列化类的所有成员(包括私有的),且不需要类有无参数的构造方法。
使用二进制格式序列化时,它不仅是将对象的字段数据进行持久化,也持久化每个类型的完全限定名称和定义程序集的完整名称(包括包称、版本、公钥标记、区域性),这些数据使得在进行二进制格式反序列化时亦会进行类型检查。所以反序列化时的运行环境要与序列化时的运行环境要相同,否者可能会无法反序列化成功。

5、使用SOAP方式序列化和反序列化

 

  SOAP序列化与反序列化的程序示例[Serializable]  //必须添加序列化特性public class Person{private string Name;//姓名private bool Sex;//性别,是否是男public Person(string name, bool sex){this.Name = name;this.Sex = sex;}public override string ToString(){return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");}}[Serializable]  //必须添加序列化特性public class Programmer : Person{private string Language;//编程语言public Programmer(string name, bool sex, string language) : base(name, sex){this.Language = language;}public override string ToString(){return base.ToString() + "\t编程语言:" + this.Language;}}class Program{static void Main(string[] args){//实例化对象Programmer p = new Programmer("李志伟", true, "C、C#、C++、Java");//使用SOAP序列化对象string fileName = @"D:\users\lizw\桌面\Programmers.xml";//文件名称与路径Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);SoapFormatter soapFormat = new SoapFormatter();//创建SOAP序列化器soapFormat.Serialize(fStream, p);//SOAP不能序列化泛型对象//使用SOAP反序列化对象fStream.Position = 0;//重置流位置p = null;p = (Programmer)soapFormat.Deserialize(fStream);Console.WriteLine(p);Console.Read();}}

总结

SOAP序列化与二进制序列化的区别是:SOAP序列化不能序列化泛型类型。与二进制序列化一样在序列化时不需要向序列化器指定序列化对象的类型。而XML序列化需要向XML序列化器指定序列化对象的类型。

6、使用XML方式序列化和反序列化

 

  XML序列化与反序列化的程序示例public class Person{public string Name;//姓名public bool Sex;//性别,是否是男public Person() { }//必须提供无参构造器,否则XmlSerializer将出错public Person(string name, bool sex){this.Name = name;this.Sex = sex;}public override string ToString(){return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");}}public class Programmer : Person{public string Language;//编程语言public Programmer() { }//必须提供无参构造器,否则XmlSerializer将出错public Programmer(string name, bool sex, string language) : base(name, sex){this.Language = language;}public override string ToString(){return base.ToString() + "\t编程语言:" + this.Language;}}class Program{static void Main(string[] args){//创建Programmer列表,并添加对象List<Programmer> list = new List<Programmer>();list.Add(new Programmer("李志伟", true, "C#"));list.Add(new Programmer("Coder2", false, "C++"));list.Add(new Programmer("Coder3", true, "Java"));//使用XML序列化对象string fileName = @"D:\users\lizw\桌面\Programmers.xml";//文件名称与路径Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);XmlSerializer xmlFormat = new XmlSerializer(
typeof(List<Programmer>),
new Type[] { typeof(Programmer),typeof(Person) }
);//创建XML序列化器,需要指定对象的类型xmlFormat.Serialize(fStream, list);//使用XML反序列化对象fStream.Position = 0;//重置流位置list.Clear();list = (List<Programmer>)xmlFormat.Deserialize(fStream);foreach (Programmer p in list){Console.WriteLine(p);}Console.Read();}}

总结

使用XML序列化或反序列化时,需要对XML序列化器指定需要序列化对象的类型和其关联的类型。
XML序列化只能序列化对象的公有属性,并且要求对象有一个无参的构造方法,否者无法反序列化。
[Serializable]和[NonSerialized]特性对XML序列化无效!所以使用XML序列化时不需要对对象增加[Serializable]特性。

.Net序列化与反序列化相关推荐

  1. [Java]LeetCode297. 二叉树的序列化与反序列化 | Serialize and Deserialize Binary Tree

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  2. 序列化和反序列化实现

    1. 什么是序列化? 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入文件或是将其传输到网络中的另一台计算机上以实现通讯.这个将程序数据转换成能被存储并传输的格式的过程被称 ...

  3. Json的序列化和反序列化

    1.引用命名空间: using System.Runtime.Serialization; 2.json的序列化和反序列化的方法: publicclass JsonHelper { ///<su ...

  4. C#实现对象的Xml格式序列化及反序列化

    要序列化的对象的类: [Serializable] public class Person { private string name; public string Name { get { retu ...

  5. c语言xml序列化,C# XML和实体类之间相互转换(序列化和反序列化)

    我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...

  6. 十三、序列化和反序列化(部分转载)

    json和pickle序列化和反序列化 json是用来实现不同程序之间的文件交互,由于不同程序之间需要进行文件信息交互,由于用python写的代码可能要与其他语言写的代码进行数据传输,json支持所有 ...

  7. java培训教程分享:Java中怎样将数据对象序列化和反序列化?

    本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...

  8. K:java中的序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?以下内容将围绕这些问题进行展开讨论. Java序列化与反序列化 简单来说Java序列化是指把Java对象转 ...

  9. json的序列化与反序列化

    json 是一种轻量级的数据交换格式,也是完全独立于任何程序语言的文本格式. 本文介绍json字符串的序列化与反序列化问题. 序列化 是指将变量(对象)从内存中变成可存储或可传输的过程. 反序列化 是 ...

  10. 深入分析Java的序列化与反序列化

    阅读目录 Java对象的序列化 如何对Java对象进行序列化与反序列化 序列化及反序列化相关知识 ArrayList的序列化 ObjectOutputStream 总结 序列化是一种对象持久化的手段. ...

最新文章

  1. iphone通讯录批量删除_iPhone通讯录删除了如何恢复?用对方法快速找回,亲测有效!_...
  2. 函数传参字典_Python 函数参数解包
  3. IE下及标准浏览器下的图片旋转(二)—— Canvas(1)
  4. dell r720服务器raid5安装centos6.5系统
  5. php三位不够前面加0,php 格式化数字 位数不足前面加0补足的实现方法
  6. wxWidgets:wxWindowCreateEvent类用法
  7. OpenShift 4 之脚本化部署Istio的HelloWorld和BookInfo示例
  8. [转载] 七龙珠第一部——第086话 打进前八强
  9. mpvue 小程序 页面unLoad后数据没清空
  10. RHEL7下Nginx配置文件详解(二)
  11. php 日期范围查询分页,Thinkphp3.2 多条件数据分页查询
  12. 扇贝有道每日一句180904
  13. linux查看行数命令 set,Linux显示文件行数之nl命令详解
  14. 用Python模拟一个区域广播通信网络 2020年4月认证杯数学建模比赛代码
  15. catia二次开发:人机交互select,start command
  16. 手机5款令人爱不释手的APP 好用到爆
  17. 【Vue】win10启动vue项目报错: errno: -4058, code: ‘ENOENT‘, syscall: ‘spawn cmd‘
  18. 北京冬奥会 向世界展示了什么
  19. Java开发面试常见的技术问题整理
  20. linux中获取系统时间的几种方法

热门文章

  1. 使用思维导图书写-BES软件开发架构
  2. win7下 一键ghost/一键还原软件卸载后 删除相关开机启动选项
  3. Debian9换源(阿里源)(Linux子系统)
  4. 劳斯(Routh)判据
  5. 银联生成ARQC,ARPC,MAC,CVN生成
  6. python怎么读取pdf为文本_轻松用Python批量提取PDF文本内容,这个小技巧告诉你!...
  7. 奇幻到android studio 的DUANG 蛮捄三
  8. MES管理系统的应用和好处有哪些
  9. 0745A-4.4T
  10. RJM8L151 基于额温枪开发资料