序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。

  我想最主要的作用有:

  1、在进程下次启动时读取上次保存的对象的信息

  2、在不同的AppDomain或进程之间传递数据

  3、在分布式应用系统中传递数据

  ......

  在C#中常见的序列化的方法主要也有三个:BinaryFormatter、SoapFormatter、XML序列化

  本文就通过一个小例子主要说说这三种方法的具体使用和异同点

  这个例子就是使用三种不同的方式把一个Book对象进行序列化和反序列化,当然这个Book类首先是可以被序列化的。至于怎么使一个类可以序列化可以参见:C#强化系列文章一:ViewState使用兼谈序列化

  Book类

  using System;

  using System.Collections;

  using System.Text;

  namespace SerializableTest

  {

  [Serializable]

  public class Book

  {

  public Book()

  {

  alBookReader = new ArrayList();

  }

  public string strBookName;

  [NonSerialized]

  public string strBookPwd;

  private string _bookID;

  public string BookID

  {

  get { return _bookID; }

  set { _bookID = value; }

  }

  public ArrayList alBookReader;

  private string _bookPrice;

  public void SetBookPrice(string price)

  {

  _bookPrice = price;

  }

  public void Write()

  {

  Console.WriteLine("Book ID:" + BookID);

  Console.WriteLine("Book Name:" + strBookName);

  Console.WriteLine("Book Password:" + strBookPwd);

  Console.WriteLine("Book Price:" + _bookPrice);

  Console.WriteLine("Book Reader:");

  for (int i = 0; i < alBookReader.Count; i++)

  {

  Console.WriteLine(alBookReader[i]); [Page]

  }

  }

  }

  }

  这个类比较简单,就是定义了一些public字段和一个可读写的属性,一个private字段,一个标记为[NonSerialized]的字段,具体会在下面的例子中体现出来

  一、BinaryFormatter序列化方式

  1、序列化,就是给Book类赋值,然后进行序列化到一个文件中

  Book book = new Book();

  book.BookID = "1";

  book.alBookReader.Add("gspring");

  book.alBookReader.Add("永春");

  book.strBookName = "C#强化";

  book.strBookPwd = "*****";

  book.SetBookPrice("50.00");

  BinarySerialize serialize = new BinarySerialize();

  serialize.Serialize(book);2、反序列化

  BinarySerialize serialize = new BinarySerialize();

  Book book = serialize.DeSerialize();

  book.Write();3、测试用的

  BinarySerialize类

  using System;

  using System.Collections.Generic;

  using System.Text;

  using System.IO;

  using System.Runtime.Serialization.Formatters.Binary;

  namespace SerializableTest

  {

  public class BinarySerialize

  {

  string strFile = "c:\book.data";

  public void Serialize(Book book)

  {

  using (FileStream fs = new FileStream(strFile, FileMode.Create))

  {

  BinaryFormatter formatter = new BinaryFormatter();

  formatter.Serialize(fs, book);

  }

  }

  public Book DeSerialize()

  {

  Book book;

  using (FileStream fs = new FileStream(strFile, FileMode.Open))

  {

  BinaryFormatter formatter = new BinaryFormatter(); [Page]

  book = (Book)formatter.Deserialize(fs);

  }

  return book;

  }

  }

  }

  主要就是调用System.Runtime.Serialization.Formatters.Binary空间下的BinaryFormatter类进行序列化和反序列化,以缩略型二进制格式写到一个文件中去,速度比较快,而且写入后的文件已二进制保存有一定的保密效果。

  调用反序列化后的截图如下:

  也就是说除了标记为NonSerialized的其他所有成员都能序列化

  二、SoapFormatter序列化方式

  调用序列化和反序列化的方法和上面比较类似,我就不列出来了,主要就看看SoapSerialize类

  SoapSerialize类

  using System;

  using System.Collections.Generic;

  using System.Text;

  using System.IO;

  using System.Runtime.Serialization.Formatters.Soap;

  namespace SerializableTest

  {

  public class SoapSerialize

  {

  string strFile = "c:\book.soap";

  public void Serialize(Book book)

  {

  using (FileStream fs = new FileStream(strFile, FileMode.Create))

  {

  SoapFormatter formatter = new SoapFormatter();

  formatter.Serialize(fs, book);

  }

  }

  public Book DeSerialize()

  {

  Book book;

  using (FileStream fs = new FileStream(strFile, FileMode.Open))

  {

  SoapFormatter formatter = new SoapFormatter();

  book = (Book)formatter.Deserialize(fs);

  }

  return book;

  }

  }

  }

  主要就是调用System.Runtime.Serialization.Formatters.Soap空间下的SoapFormatter类进行序列化和反序列化,使用之前需要应用System.Runtime.Serialization.Formatters.Soap.dll(.net自带的)

  序列化之后的文件是Soap格式的文件(简单对象访问协议(Simple Object Access Protocol,SOAP),是一种轻量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。SOAP使用基于XML的数据结构和超文本传输协议(HTTP)的组合定义了一个标准的方法来使用Internet上各种不同操作环境中的分布式对象。) [Page]

  调用反序列化之后的结果和方法一相同

  三、XML序列化方式

  调用序列化和反序列化的方法和上面比较类似,我就不列出来了,主要就看看XmlSerialize类

  XmlSerialize类

  using System;

  using System.Collections.Generic;

  using System.Text;

  using System.IO;

  using System.Xml.Serialization;

  namespace SerializableTest

  {

  public class XmlSerialize

  {

  string strFile = "c:\book.xml";

  public void Serialize(Book book)

  {

  using (FileStream fs = new FileStream(strFile, FileMode.Create))

  {

  XmlSerializer formatter = new XmlSerializer(typeof(Book));

  formatter.Serialize(fs, book);

  }

  }

  public Book DeSerialize()

  {

  Book book;

  using (FileStream fs = new FileStream(strFile, FileMode.Open))

  {

  XmlSerializer formatter = new XmlSerializer(typeof(Book));

  book = (Book)formatter.Deserialize(fs);

  }

  return book;

  }

  }

  }

  从这三个测试类我们可以看出来其实三种方法的调用方式都差不多,只是具体使用的类不同

  xml序列化之后的文件就是一般的一个xml文件:

  book.xml

  <?xml version="1.0"?>

  <Book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <strBookName>C#强化</strBookName>

  <strBookPwd>*****</strBookPwd>

  <alBookReader>

  <anyType xsi:type="xsd:string">gspring</anyType>

  <anyType xsi:type="xsd:string">永春</anyType>

  </alBookReader>

  <BookID>1</BookID>

  </Book>输出截图如下:

  也就是说采用xml序列化的方式只能保存public的字段和可读写的属性,对于private等类型的字段不能进行序列化

  关于循环引用:

  比如在上面的例子Book类中加入如下一个属性:

  public Book relationBook;

  在调用序列化时使用如下方法:

  Book book = new Book();

  book.BookID = "1"; [Page]

  book.alBookReader.Add("gspring");

  book.alBookReader.Add("永春");

  book.strBookName = "C#强化";

  book.strBookPwd = "*****";

  book.SetBookPrice("50.00");

  Book book2 = new Book();

  book2.BookID = "2";

  book2.alBookReader.Add("gspring");

  book2.alBookReader.Add("永春");

  book2.strBookName = ".NET强化";

  book2.strBookPwd = "*****";

  book2.SetBookPrice("40.00");

  book.relationBook = book2;

  book2.relationBook = book;

  BinarySerialize serialize = new BinarySerialize();

  serialize.Serialize(book);这样就会出现循环引用的情况,对于BinarySerialize和SoapSerialize可以正常序列化(.NET内部进行处理了),对于XmlSerialize出现这种情况会报错:"序列化类型 SerializableTest.Book 的对象时检测到循环引用。"

转载于:https://www.cnblogs.com/ygzhong000/p/3619208.html

C#序列化和反序列化相关推荐

  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. 【Linux】服务器常用的操作命令
  2. 《Selenium2自动化测试实战基于Python语言》读书笔记
  3. Ajax请求成功后页面跳转
  4. 基于springboot的美食系统
  5. GPON介绍及华为OLT网关注册配置流程
  6. 5套精美的石器时代游戏官方网页源码
  7. SystemV 共享内存
  8. Win2008建立kms服务器vlmcsd
  9. Mp4Box 常用指令
  10. c语言mod是什么意思,mod什么意思中文意思,Mod是什么意思
  11. python把英语句子成分字母_python把英语句子成分字母
  12. Python绘制圆锥曲线动画
  13. LPVOID和PVOID的区别是什么
  14. 网上赚钱的平台哪个好?7个方式总有你喜欢的!
  15. js阻止子元素事件_JS点击子元素不触发父元素点击事件(js阻止冒泡)
  16. 帝国php调用文章列表,帝国cms教程内容页面调用当前会员信息和文章数量以及文章列表...
  17. 计算机二级选择题37套word,计算机二级word选择题
  18. L1-030. 一帮一
  19. DC Motor 参数的理解
  20. 微信小程序详细登录流程(图解+代码流程)

热门文章

  1. 使用VS2005进行负载测试
  2. css --- 兄弟选择器
  3. 【小贴士】虚拟键盘与fixed带给移动端的痛!
  4. 有的日期输入框,可直接调用javascripts
  5. “高考”机器人横空出世 2017年居然要考“大学”
  6. vim编程 插入 保存不退出 保存退出 退出不保存 另存为其他文件名 保存覆盖现有文件...
  7. centons7网卡配置文件使用openvswitch bridge
  8. MySQL 调用存储过程
  9. byte转化为Bitmap,防止内存溢出
  10. ssacanf\Sprintf格式化字符串