`
pcajax
  • 浏览: 2174692 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

c#.net实体类序列化方法  为什么要序列化

阅读更多
 
  提到为了传递数据,需要把作为载体的实体类序列化,好好的找了一些序列化方面的介绍。感觉下面的这个介绍比较容易介绍!
  1.什么是序列化
  序列化是将对象状态转换为可保持或传输的格式的过程,在序列化过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
  2.为什么使用序列化
  a. 一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本。
  我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。
  b.另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中。
  例如,序列化可用于在 ASP.NET 中保存会话状态并将对象复制到 Windows 窗体的剪贴板中。远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中。
  公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。
  当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。
  3.如何实现对象的序列化及反序列化
  要实现对象的序列化,首先要保证该对象可以序列化。而且,序列化只是将对象的属性进行有效的保存,对于对象的一些方法则无法实现序列化的。
  实现一个类可序列化的最简便的方法就是增加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();
  4、如何变相实现自定义可视化控件的序列化、反序列化
  对于WinForm中自定义控件,由于继承于System.Windows.Form类,而Form类又是从MarshalByRefObject继承的,窗体本身无法做到序列化,窗体的实现基于Win32下GUI资源,不能脱离当前上下文存在。
  当然可以采用变通的方法实现控件的序列化。这里采用的是记忆类模型。
  定义记忆类(其实就是一个可序列化的实体类)用于记录控件的有效属性,需要序列化控件的时候,只需要将该控件的实例Copy到记忆类,演变成序列化保存该记忆类的操作。
  反序列化是一个逆过程。将数据流反序列化成为该记忆类,再根据该记忆类的属性生成控件实例。而对于控件的一些事件、方法则可以继续使用。
  wwf之所以强调要把类实例化,就是因为工作流和应用程序是在不同的线程中。二者之间需要用类作为传递数据的载体的话,就需要把该类定义为public序列化为二进制传输。

分享到:
评论

相关推荐

    .NET XML序列化为实体类与反序列化

    .NET框架中的XML序列化和反序列化是将XML文档数据转换为C#对象,以及将C#对象转换回XML文档的重要技术。这个过程对于数据交换、持久化存储和跨平台通信非常有用。以下是对".NET XML序列化为实体类与反序列化"这一...

    .net实体类编辑器

    在使用`.NET实体类编辑器`时,通常需要连接到目标数据库,选择要生成实体类的表,然后编辑器会根据表的字段信息自动生成包含属性和方法的实体类。这些属性对应数据库表的列,方法如`Save()`用于保存对象到数据库,`...

    C# 类序列化 文件数据库 串行化

    首先,让我们深入理解什么是C#中的类序列化。在C#中,序列化允许我们将对象实例转换为字节流,这可以是XML、JSON或其他二进制格式。这样做是为了持久化对象的状态,也就是将对象的所有属性和字段保存下来,即使程序...

    C# JSON实体类生成工具

    该工具的核心功能在于,它允许用户直接输入或粘贴JSON字符串,然后自动生成对应的C#实体类代码,从而免去了手动编写这些类的繁琐工作。 首先,理解JSON实体类的概念是至关重要的。在C#中,一个JSON实体类通常是一个...

    C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

    本文实例讲述了C#实现XML与实体类之间相互转换的方法。分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System...

    C# Dynamic通用反序列化Json类型并遍历属性比较

    所有在反序列化Json字符串时需要一种通用的转换方式,而不是写死的某个类的反序列化,这里介绍的一种思路就是使用dynamic关键字来实现通用反序列化并比较反序列化后的对象是否深度相等即比较对象的各个字段是否相等...

    C#.net面试小集

    - **抽象类继承实体类**:抽象类可以从实体类继承,实体类需具备显式定义的构造函数。 #### 4. 构造器的继承与重写 - **构造器特性**:构造器不能被继承,因此也不能被重写。 - **重载**:构造器可以通过参数的...

    json直接转动态类型,反序列化避免新建实体类。

    在.NET框架中,我们可以使用多种方式来实现这一过程,而"json直接转动态类型,反序列化避免新建实体类"就是一个高效且灵活的方法。 动态类型在C#中是一个强大的特性,它允许我们在运行时决定变量的类型。使用动态...

    C#实现实体类与字符串互相转换的方法

    在这个例子中,我们利用反射实现了实体类与字符串的互转,这对于处理数据序列化、反序列化或者数据传输等问题非常有用。当然,这只是一个基础的实现,实际应用中可能需要考虑更多因素,例如异常处理、数据验证和性能...

    C#+实体类反射+初阶

    它可能包含一个或多个实体类,一个反射辅助类用于执行CRUD操作,以及XML相关的序列化和反序列化代码。通过查看和学习这个示例,开发者可以更好地理解如何在实际项目中整合C#的反射和XML功能。 总结来说,"C#+实体类...

    C# 转换实体类为Json字符串

    实体类转换成 JSON 字符串,将datatable转换为json,DataTable转换实体类

    C#,.Net软件工程师面试题

    ### C# 和 .Net 软件工程师面试知识点解析 #### 1. 类与结构的区别 - **定义**: - **类**:是引用类型,使用 `class` 关键字定义,支持继承,可以实现接口。 - **结构**:是值类型,使用 `struct` 关键字定义,...

    json转换c#实体类代码

    这个压缩包文件“json转换c#实体类代码”提供了一个工具,能够帮助开发者快速便捷地将JSON字符串自动转化为C#实体类的源代码。 该工具名为“JsonCSharpClassGenerator”,其包含两个文件:JsonCSharpClassGenerator...

    Json转换成C#实体类工具

    4. 输出:生成的C#实体类代码以文本形式展示给用户,用户可以选择复制到剪贴板或者保存为.cs文件。 对于C#开发者来说,这样的工具能够无缝集成到他们的开发流程中,尤其是在处理API响应或序列化/反序列化过程中。...

    通过xsd产生C#实体类解析XML或生成XML

    生成的C#实体类包含了XML元素和属性对应的字段和属性,它们都继承自`System.Xml.Serialization.XmlRootAttribute`或`System.Xml.Serialization.XmlTypeAttribute`,这使得我们可以使用.NET的XML序列化功能。...

    c#两种简单的json类和对象的序列化和解析

    本篇将重点介绍在C#中如何使用两种简单的方法对JSON进行序列化和反序列化:一种是基于Hashtable,另一种是使用实体类,并会提及到第三方库Newtonsoft.Json。 首先,我们来讨论使用Hashtable进行JSON序列化和解析。...

    EasyCode 好用的C# .net代码生成器

    2. `Newtonsoft.Json.dll`:这是一个著名的.NET库,用于JSON序列化和反序列化。EasyCode可能使用它来处理JSON格式的数据,例如读取或写入配置文件,或者在生成代码时涉及JSON数据交换。 3. `EasyCode.exe` 和 `...

    C#实体类转换为JSON字符串

    标题中提到的“C#实体类转换为JSON字符串”,主要涉及到`JsonConvert`类中的`SerializeObject`方法。以下是一个简单的例子,展示如何使用这个方法: ```csharp using Newtonsoft.Json; public class User { ...

    JSON的序列化与反序列化

    利用JSON.NET制作的,对JSON文本进行序列化和反序列化操作的类,可反序列化成实体类或Dictionary,也可从类或Dictionary序列化成JSON文本

Global site tag (gtag.js) - Google Analytics