知识大全 c#实体类序列化方法

Posted

篇首语:只有知道如何停止的人才知道如何加快速度。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 c#实体类序列化方法相关的知识,希望对你有一定的参考价值。

  提到为了传递数据 需要把作为载体的实体类序列化 好好的找了一些序列化方面的介绍 感觉下面的这个介绍比较容易介绍!

   什么是序列化

  序列化是将对象状态转换为可保持或传输的格式的过程 在序列化过程中 对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流 然后写入数据流 与序列化相对的是反序列化 它将流转换为对象 这两个过程结合起来 可以轻松地存储和传输数据

   为什么使用序列化

  a 一个原因是将对象的状态保持在存储媒体中 以便可以在以后重新创建精确的副本

  我们经常需要将对象的字段值保存到磁盘中 并在以后检索此数据 尽管不使用序列化也能完成这项工作 但这种方法通常很繁琐而且容易出错 并且在需要跟踪对象的层次结构时 会变得越来越复杂 可以想象一下编写包含大量对象的大型业务应用程序的情形 程序员不得不为每一个对象编写代码 以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性 序列化提供了轻松实现这个目标的快捷方法

  b 另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中

  例如 序列化可用于在 ASP NET 中保存会话状态并将对象复制到 Windows 窗体的剪贴板中 远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中

  公共语言运行时 (CLR) 管理对象在内存中的分布 NET 框架则通过使用反射提供自动的序列化机制 对象序列化后 类的名称 程序集以及类实例的所有数据成员均被写入存储媒体中 对象通常用成员变量来存储对其他实例的引用 类序列化后 序列化引擎将跟踪所有已序列化的引用对象 以确保同一对象不被序列化多次 NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用 对对象图表的唯一要求是 由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基本序列化) 否则 当序列化程序试图序列化未标记的对象时将会出现异常

  当反序列化已序列化的类时 将重新创建该类 并自动还原所有数据成员的值

   如何实现对象的序列化及反序列化

  要实现对象的序列化 首先要保证该对象可以序列化 而且 序列化只是将对象的属性进行有效的保存 对于对象的一些方法则无法实现序列化的

  实现一个类可序列化的最简便的方法就是增加Serializable属性标记类 如

  [Serializable()]

  public class MEABlock

  

  private int m_ID;

  public string Caption;

  public MEABlock()

  

  ///构造函数

  

  

  即可实现该类的可序列化 注意序列化的类必须为Public 否则不能够被序列化

  要将该类的实例序列化为到文件中? NET FrameWork提供了两种方法

  a XML序列化

  使用 XmLSerializer 类 可将下列项序列化

  公共类的公共读/写属性和字段

  实现 ICollection 或 IEnumerable 的类 (注意只有集合会被序列化 而公共属性却不会 )

  XmlElement 对象

  XmlNode 对象

  DataSet 对象

  要实现上述类的实例的序列化 可参照如下例子

  MEABlock myBlock = new MEABlock();

  // Insert code to set properties and fields of the object

  XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));

  // To write to a file create a StreamWriter object

  StreamWriter myWriter = new StreamWriter( myFileName xml );

  mySerializer Serialize(myWriter MEABlock);

  需要注意的是XML序列化只会将public的字段保存 对于私有字段不予于保存

  生成的XML文件格式如下

  <MEABlock>

  <Caption>Test</Caption>

  </MEABlock>

  对于对象的反序列化 则如下

  MEABlock myBlock;

  // Constructs an instance of the XmlSerializer with the type

  // of object that is being deserialized

  XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));

  // To read the file creates a FileStream

  FileStream myFileStream = new FileStream( myFileName xml FileMode Open);

  // Calls the Deserialize method and casts to the object type

  myBlock = (MEABlock)mySerializer Deserialize(myFileStream)

  b 二进制序列化

  与XML序列化不同的是 二进制序列化可以将类的实例中所有字段(包括私有和公有)都进行序列化操作 这就更方便 更准确的还原了对象的副本

  要实现上述类的实例的序列化 可参照如下例子

  MEABlock myBlock = new MEABlock();

  // Insert code to set properties and fields of the object

  IFormatter formatter = new BinaryFormatter();

  Stream stream = new FileStream( MyFile bin FileMode Create FileAccess Write FileShare None);

  formatter Serialize(stream myBlock);

  stream Close();

  对于对象的反序列化 则如下

  IFormatter formatter = new BinaryFormatter();

  Stream stream = new FileStream( MyFile bin FileMode Open FileAccess Read FileShare Read);

  MEABlock myBlock = (MEABlock) formatter Deserialize(stream);

  stream Close();

   如何变相实现自定义可视化控件的序列化 反序列化

  对于WinForm中自定义控件 由于继承于System Windows Form类 而Form类又是从MarshalByRefObject继承的 窗体本身无法做到序列化 窗体的实现基于Win 下GUI资源 不能脱离当前上下文存在

  当然可以采用变通的方法实现控件的序列化 这里采用的是记忆类模型

  定义记忆类(其实就是一个可序列化的实体类)用于记录控件的有效属性 需要序列化控件的时候 只需要将该控件的实例Copy到记忆类 演变成序列化保存该记忆类的操作

  反序列化是一个逆过程 将数据流反序列化成为该记忆类 再根据该记忆类的属性生成控件实例 而对于控件的一些事件 方法则可以继续使用

cha138/Article/program/net/201311/13795

相关参考

知识大全 C# XML序列化实例浅析

C#XML序列化实例浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  实现C#XML序列化技术

知识大全 c#如何获得cpu,硬盘的物理序列号

  简介这是c#如何获得cpu硬盘的物理序列号的详细页面介绍了和c/c++有关的知识加入收藏请按键盘ctrl+D谢谢大家的观看!要查看更多有关信息  usingsystem;  usingsystem

知识大全 读写序列化类的例子

  目的:保存序列化类到文件然后从文件中读取保存的序列化类  概念:序列化类:所谓序列化类实际上就是将类本身所有信息变成流格式进行保存传输等功能这点对于远程调用(RMI)非常重要可以将序列化类变成流格

知识大全 GridView绑定实体类的子实体的字段

GridView绑定实体类的子实体的字段  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  表use

知识大全 使用NBear创建EntityDesign实体类

使用NBear创建EntityDesign实体类  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 C#学习之——认识C#的内部类

C#学习之——认识C#的内部类  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#中的内部类能够

知识大全 读取指定盘符的硬盘序列号

C#应用:读取指定盘符的硬盘序列号  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixinz

知识大全 C#接口和抽象类技术特点浅析

C#接口和抽象类技术特点浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一C#抽象类  C#

知识大全 c# 类,抽象类 抽象方法 的理解

  本文是学习抽象类的以及抽象类中静态字段静态方法的知识  我写本文前对抽象类的理解  A是为了继承的需要或者是为了多态的需要把具有类似行为的一组概念写成一个抽象类但是抽象类里面不实现任何行为仅仅是定

知识大全 C#汉字转拼音功能类

C#汉字转拼音功能类  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  此代码属改造而来没有太深的技