什么是序列化以及如何实现序列化?

序列化是通过将对象转换为字节流,从而存储对象或将对象传输到内存,数据库或文件的过程。主要用途是保存对象的状态,包括对象的数据,以便能够在需要是重建对象。反向过程称为 反序列化。

如上图所示,对象 object 被序列化为 流,其中不仅包含数据、还包含对象类型的相关信息,如版本、区域性和程序集名称。然后可以将此流中的内容存储到数据库、文件或内存中。

序列化的用途:

通过序列化,可以执行如下操作:通过 Web 服务将对象发送到远程应用程序、在域之间传递对象、以 XML 字符串的形式传递对象通过防火墙、跨应用程序维护安全性或用户专属信息。

让对象可序列化:

需要具有对象、包含已序列化对象的一个流,以及一个 Fromatter。

System.Runtime.Serialization 包含序列化和反序列化对象所必须的类。

将 SerializableAttribute 特性应用于某个类型,以表示此类型的实例可以被序列化,如果对没有 SerializableAttribute 特性的类型进行序列化,则会引发异常。

如果想让类中的某个字段不可序列化,可以使用 NonSerializedAttribute 特性。

序列化的三种类型--二进制、XML、JSON

可以使用二进制 binary 或 XML 进行序列化,在 二进制序列化中,所有内容都会被序列化,且性能也很好,使用二进制编码来生成精简的序列化,可以用于基于存储或socket的网络流。

XML 序列化可提高可读性,以及对象共享和使用的灵活性,XML 序列化将对象的公共字段和属性或方法的参数和返回值序列化成符合特定 XML 格式的流,

System.Xml.Serialization 包含序列化和反序列化 XML 所需要的类

如果要保存运行程序过程的数据要么保存到数据库中,要么新建一个普通的文件,然后把数据保存进去.但是这两者有个缺点就是,不能把原有数据的结构也保存进去.比如一个类中的字段值保存进去后再读取出来必须再解析下才行.序列化技术让你省去了解析的过程.保存后再读取时直接得到一个class

序列化的方式有三种:BinaryFormatter,SoapFormatter,XmlSerializer

1.BinaryFormatter

保存成二进制数据流.用法示例:

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
//如果要想保存某个class中的字段,必须在class前面加个这样attribute(C#里面用中括号括起来的标志符)
public class Person
{
public int age;
public string name;
[NonSerialized] //如果某个字段不想被保存,则加个这样的标志
public string secret;
}

序列化:

classProgram
{staticvoid Main(string[] args)
{
Person person = newPerson();
person.age = 18;
person.name = "tom";
person.secret = "i will not tell you";
FileStream stream =newFileStream(@"c:\temp\person.dat",FileMode.Create);
BinaryFormatter bFormat =newBinaryFormatter();
bFormat.Serialize(stream, person);
stream.Close();
}

反序列化:

classProgram
{
staticvoid Main(string[] args)
{
Person person = newPerson();
FileStream stream =newFileStream(@"c:\temp\person.dat",FileMode.Open);
BinaryFormatter bFormat =newBinaryFormatter();
person = (Person)bFormat.Deserialize(stream);
//反序列化得到的是一个object对象.必须做下类型转换
stream.Close();
Console.WriteLine(person.age + person.name + person.secret);
//结果为18tom.因为secret没有有被序列化.
}

2.SoapFormatter

把数据保存成xml文件.里面除了保存的内容还有些额外的Soap信息.它的用法和BinaryFormatter一样.只要把BinaryFormatter都替换成SoapFormatter就行.

把文件名改为person.xml

另外就是添加名称空间:using System.Runtime.Serialization.Formatters.Soap;
这个名称空调对就的程序集有时VS没有自动引用.你必须手动去引用.选中project,右击选择Add Reference.在.NET的标签下选择

System.Runtime.Serialization.Formatters.Soap.然后点OK.

补充:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。

3.XmlSerializer

也是保存成XML文件.但没有其他额外信息.另外它只能保存public类型的字段.而其他两种类型能保存所有类型的字段.
这里仍使用上面的Person类.

实例1:

添加名称空间:

using System.IO;
using System.Xml.Serialization;

序列化:

classProgram
{staticvoid Main(string[] args)
{
Person person = newPerson();
person.age = 18;
person.name = "tom";
person.secret = "i will not tell you";
FileStream stream =newFileStream(@"c:\temp\xmlFormat.xml",FileMode.Create);
XmlSerializer xmlserilize = newXmlSerializer(typeof(Person));
xmlserilize.Serialize(stream, person);
stream.Close();
}

反序列化:

classProgram
{
staticvoid Main(string[] args)
{
Person person = newPerson();
FileStream stream =newFileStream(@"c:\temp\xmlFormat.xml",FileMode.Open);
XmlSerializerxmlserilize = newXmlSerializer(typeof(Person));
person = (Person)xmlserilize.Deserialize(stream);
stream.Close();
Console.WriteLine(person.age + person.name + person.secret);
}

指定 XML 标签的名字

[XmlRoot(department)]
public class Department {public string DeptName { get; set; }[XmlElement("extra")]public DeptExtraInfo DeptExtraInfo { get; set; }
}

通过在 XmlRoot、XmlElement 后面加上一个括号即可实现,其中XmlRoot用于指定“根”,也就是XML的最上一层的Tag

指定 XML 标签的属性

[XmlRoot("department")]
public class Department {public string DeptName { get; set; } = "研发部";[XmlAttribute("timestamp")]public int Timestamp = 10;
}

Timestamp就成为了department这个根节点的timestamp属性。

实例2:

public class Book
{  public String title;
}         public void ReadXML()
{  // First write something so that there is something to read ...  var b = new Book { title = "Serialization Overview" };  var writer = new System.Xml.Serialization.XmlSerializer(typeof(Book));  var wfile = new System.IO.StreamWriter(@"c:\temp\SerializationOverview.xml");  writer.Serialize(wfile, b);  wfile.Close();  // Now we can read the serialized book ...  System.Xml.Serialization.XmlSerializer reader =   new System.Xml.Serialization.XmlSerializer(typeof(Book));  System.IO.StreamReader file = new System.IO.StreamReader(  @"c:\temp\SerializationOverview.xml");  Book overview =  (Book)reader.Deserialize(file);  file.Close();  Console.WriteLine(overview.title);  }

传统方法生成xml:(超链接)

C#在WINForm程序中创建XML文件

C#序列化与反序列化详解相关推荐

  1. 对象的序列化与反序列化详解

    [1] 序列化与反序列化 如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化. 简单来说: 序列化:将数据结构或对象转换成二 ...

  2. Java对象序列化详解6,Java对象的序列化与反序列化详解

    把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种途径: Ⅰ . 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 Ⅱ.  在网 ...

  3. Java序列化与反序列化详解

    面试官:兄弟,说说你对transient的理解和感悟 哪吒:what?还有感悟? 先说结论,在序列化.反序列化时,被transient关键字修饰的成员属性变量不会被序列化. 面试官:这就完了? 哪吒: ...

  4. Java序列化和反序列化(详解)

    一.理解Java序列化和反序列化 Serialization(序列化):将java对象以一连串的字节保存在磁盘文件中的过程,也可以说是保存java对象状态的过程.序列化可以将数据永久保存在磁盘上(通常 ...

  5. Java 序列化和反序列化详解完整版

    目录 一.序列化 1.1.Serialization(序列化): 1.2.deserialization(反序列化) 二.序列化和反序列化的应用 java序列化的优点: 三.序列化和反序列化地实现 3 ...

  6. php 序列化 java_PHP--序列化与反序列化详解

    PHP--序列化与反序列化详解 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 所有php里面的值都可以使用函数seria ...

  7. php中对象怎么访问i属性_PHP--序列化与反序列化详解

    PHP--序列化与反序列化详解 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 学到网络安全的时候用到了序列化和反序列化的 ...

  8. PHP反序列化详解(二)——PHP魔术方法与PHP反序列化漏洞

    今天继续给大家介绍渗透测试相关知识,本文主要内容是PHP反序列化详解(二)--PHP魔术方法与PHP反序列化漏洞. 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成 ...

  9. PHP序列化_serialize_格式详解

    PHP序列化 serialize 格式详解 1.前言 PHP (从PHP 3.05 开始)为保存对象提供了一组序列化和反序列化的函数:serialize.unserialize.不 过在PHP 手册中 ...

最新文章

  1. 下列不属于python第三方库的是-测验9: Python计算生态纵览 (第9周)-单选题
  2. OEM中无法用sys用户登录
  3. 电脑主板维修_自学电脑主板维修第48讲
  4. linux中atoi函数的实现 值得借鉴,【转】atoi()函数的实现
  5. 百度贴吧——因百度账号策略调整导致长时间未登录的账号(最后登录在2017年6月1日以前)网页端无法登陆、移动端异常解决方案
  6. php curl 防止采集,php多线程采集网页的解决办法 curl多线程采集
  7. 一线互联网企业面试题总结(帮你成功拿到offer)
  8. android https双向认证
  9. 使用base64:url 来定义背景图片url
  10. 数据结构与算法python—9.二叉树及python实现
  11. 如何重置HDX卡的固件(firmware)
  12. web前端登录页面设计技巧
  13. JavaScript打开APP
  14. h5策划书_世界睡眠日H5策划方案
  15. mysql java配置文件_Mysql配置文件参数优化
  16. 一个简单的例子让你理解强化学习是什么,和有监督学习的区别又是什么
  17. 深入理解 Comparable 接口和 Comparator 接口以及Arrays.sort()
  18. 如何检查后台服务(Android的Service类)是否正在运行?
  19. java supper关键字
  20. 11虚幻4【UE4】 让物体/图标始终朝向相机

热门文章

  1. 三、SpringBoot-application.properties配置文件和application.yml配置文件
  2. C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质...
  3. 写出一个缓存系统的伪代码001
  4. 自定义smokeping告警(邮件+短信)
  5. OpenGL中shader使用
  6. Java队列集合的性能测试
  7. beautiful sentences
  8. mysql cookbook 1
  9. 世界顶级精英们的人生哲学 【转】
  10. linux 删旧内核,Ubuntu 删除旧内核的方法