分享
 
 
 

有关.NET中序列化的一些知识

王朝c#·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

“序列化”可被定义为将对象的状态存储到存储媒介中的过程。在此过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。在以后“反序列化”该对象时,创建原始对象的精确复本。

一、为什么要选择序列化

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

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

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

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

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

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

[Serializable()]

public class MEABlock

{

private int m_ID;

public string Caption;

public MEABlock()

{

///构造函数

}

}

即可实现该类的可序列化。

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

1、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)

2、二进制序列化

与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继承的,窗体本身无法做到序列化,窗体的实现基于Win32下GUI资源,不能脱离当前上下文存在。

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

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有