c#.net实体类序列化方法

c#.net实体类序列化方法,第1张

c#.net实体类序列化方法,第2张

提到为了传递数据,需要对作为载体的实体类进行序列化,并对序列化做了一些介绍。感觉下面的介绍比较好介绍!
1。什么是序列化
序列化是将对象的状态转换为可以维护或传输的格式的过程。在序列化的过程中,一个对象的公共和私有字段以及一个类的名称(包括包含该类的程序集)都被转换成一个字节流,然后写入一个数据流。与序列化相反的是反序列化,它将流转换为对象。这两个过程的结合可以很容易地存储和传输数据。
2。为什么使用序列化
答:一个原因是将对象的状态保存在存储介质中,以便以后可以重新创建精确的副本。
我们经常需要将一个对象的字段值保存到磁盘上,以后再检索这些数据。虽然这可以在没有序列化的情况下完成,但这种方法通常很繁琐且容易出错,当需要跟踪对象的层次结构时,它会变得越来越复杂。想象一下,编写一个包含大量对象的大型业务应用程序。程序员必须为每个对象编写代码,以便将字段和属性保存到磁盘,并从磁盘恢复它们。序列化为轻松实现这一目标提供了捷径。
B .另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域。
例如,序列化可用于在ASP.NET中保存会话状态,并将对象复制到Windows窗体的剪贴板。远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域。
公共语言运行库(CLR)管理对象在内存中的分布,而。NET framework通过使用反射提供了一种自动序列化机制。对象序列化后,类名、程序集和类实例的所有数据成员都被写入存储介质。对象通常使用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有序列化的引用对象,以确保同一对象不会被序列化多次。提供的序列化体系结构。NET framework可以自动正确地处理对象图和循环引用。对象图的要求是,被序列化的对象引用的所有对象都必须标记为可序列化(请参见基本序列化)。否则,当序列化程序试图序列化未标记的对象时,将引发异常。
反序列化序列化一个序列化类时,将重新创建该类,并自动恢复所有数据成员的值。
3。如何序列化和反序列化一个对象
要序列化一个对象,首先要保证它能被序列化。而且序列化只是有效的保存了对象的属性,但是对象的一些方法并不能实现序列化。
实现类序列化最简单的方法就是添加Serializable属性来标记类。例如
[serializable()]
public class mea block
{
private int m _ id;
公共字符串标题;
public mea block()
{
//构造函数
}
可以实现该类的序列化。请注意,序列化的类必须是公共的,否则无法序列化。
要将此类的实例序列化到文件中吗?的。NET FrameWork提供了两种方法:
a .XML序列化
可以使用XmLSerializer类序列化以下各项。
public类
的公共读/写属性和字段是实现ICollection或IEnumerable的类。(请注意,只有集合是序列化的,而公共属性不是。)
XmlElement对象。
XmlNode对象。
数据集对象。
要实现上述类实例的序列化,请参考下面的例子:
mea block my block = new mea block();
//插入代码以设置对象的属性和字段。
XML serializer my serializer = new XML serializer(type of(mea block));
//若要写入文件,请创建StreamWriter对象。
StreamWriter myWriter = new StreamWriter(" my filename . XML ");
mySerializer。Serialize(myWriter,mea block);
需要注意的是,XML序列化只会保存公共字段,而不会保存私有字段。
生成的XML文件格式如下:

Test

对于对象反序列化,如下:
MEABlock my block;
//构造XmlSerializer的实例,其类型为正在反序列化的对象的
//类型。
XML serializer my serializer = new XML serializer(type of(mea block));
//为了读取文件,创建一个FileStream。
FileStream my FileStream = new FileStream(" my filename . XML ",FileMode。打开);
//调用反序列化方法并转换为对象类型。
my block =(mea block)my serializer。反序列化(myFileStream)
B .二进制序列化
与XML序列化不同,二进制序列化可以序列化类实例中的所有字段(包括私有和公共字段)。这使得恢复对象的副本更加方便和准确。
要实现上述类实例的序列化,请参考下面的例子:
mea block my block = new mea block();
//插入代码以设置对象的属性和字段。
if matter formatter = new binary formatter();
Stream Stream = new FileStream(" my file . bin ",FileMode。创建,文件访问。写,文件共享。无);
格式化程序。序列化(stream,my block);
流。close();
对于对象的反序列化,如下:
if matter Formatter = newbinary Formatter();
Stream Stream = new FileStream(" my file . bin ",FileMode。打开,文件访问。读取,文件共享。阅读);
mea block my block =(mea block)格式化程序。反序列化(流);
流。close();
4。如何实现自定义可视化控件的变相序列化和反序列化
对于WinForm中的自定义控件来说,表单本身因为继承自系统,所以无法序列化。窗体类,窗体类继承自MarshalByRefObject。窗体的实现基于Win32下的GUI资源,因此它不能脱离当前上下文而存在。
当然,您可以采用一种变通方法来实现控件的序列化。这里使用的是内存模型。
定义一个内存类(实际上是一个可序列化的实体类)用来记录一个控件的有效属性。当需要序列化一个控件的时候,只需要将控件的实例复制到内存类中,就会演化成序列化保存内存类的操作。
反序列化是一个相反的过程。将数据流反序列化到内存类中,然后根据内存类的属性生成一个控件实例。对于控件的某些事件和方法,您可以继续使用它们。
wwf强调类的实例化,因为工作流和应用程序在不同的线程中。如果需要将类作为两者之间数据传输的载体,则需要定义为公共序列化进行二进制传输。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » c#.net实体类序列化方法

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情