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



“序列化”可被定义为将对象状态存储到存储媒介中过程在此过程中对象公共字段和私有字段以及类名称(包括包含该类集)都被转换为字节流然后写入数据流在以后“反序列化”该对象时创建原始对象精确复本
、为什么要选择序列化
个原因是将对象状态保持在存储媒体中以便可以在以后重新创建精确副本;
个原因是通过值将对象从个应用域发送到另个应用域中
例如序列化可用于在 ASP.NET 中保存会话状态并将对象复制到 Windows 窗体剪贴板中远程处理还可以使用序列化通过值将对象从个应用域传递到另个应用域中
2、如何实现对象序列化及反序列化
要实现对象序列化首先要保证该对象可以序列化而且序列化只是将对象属性进行有效保存对于对象些思路方法则无法实现序列化
实现个类可序列化最简便思路方法就是增加Serializable属性标记类如:
[Serializable]
public MEABlock
{
private m_ID;
public Caption;

public MEABlock
{
///构造
}
}
即可实现该类可序列化
要将该类例子序列化为到文件中?.NET FrameWork提供了两种思路方法:
1、XML序列化
使用 XmLSerializer 类可将下列项序列化
  • 公共类公共读/写属性和字段
  • 实现 ICollection 或 IEnumerable (注意只有集合会被序列化而公共属性却不会)
  • XmlElement 对象
  • XmlNode 对象
  • DataSet 对象
要实现上述类例子序列化可参照如下例子:
MEABlock myBlock = MEABlock;
// Insert code to properties and fields of the object.
XmlSerializer mySerializer = XmlSerializer(typeof(MEABlock));
// To write to a file, create a StreamWriter object.
StreamWriter myWriter = 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 = XmlSerializer(typeof(MEABlock));
// To read the file, creates a FileStream.
FileStream myFileStream = FileStream(\"myFileName.xml\", FileMode.Open);
// Calls the Deserialize method and casts to the object type.
myBlock = (MEABlock)mySerializer.Deserialize(myFileStream)
2、 2进制序列化
和XML序列化区别 2进制序列化可以将类例子中所有字段(包括私有和公有)都进行序列化操作这就更方便、更准确还原了对象副本
要实现上述类例子序列化可参照如下例子:
MEABlock myBlock = MEABlock;
// Insert code to properties and fields of the object.
IFormatter formatter = BinaryFormatter;
Stream stream = FileStream(\"MyFile.bin\",FileMode.Create,FileAccess.Write, FileShare.None);
formatter.Serialize(stream, myBlock);
stream.Close;
对于对象反序列化则如下:
IFormatter formatter = BinaryFormatter;
Stream stream = FileStream(\"MyFile.bin\", FileMode.Open,FileAccess.Read, FileShare.Read);
MEABlock myBlock = (MEABlock) formatter.Deserialize(stream);
stream.Close;

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


对于WinForm中自定义Control控件由于继承于.Windows.Form类而Form类又是从MarshalByRefObject继承窗体本身无法做到序列化窗体实现基于Win32下GUI资源不能脱离当前上下文存在
当然可以采用变通思路方法实现Control控件序列化这里采用是记忆类模型
定义记忆类(其实就是个可序列化实体类)用于记录Control控件有效属性需要序列化Control控件时候只需要将该Control控件例子Copy到记忆类演变成序列化保存该记忆类操作
反序列化是个逆过程将数据流反序列化成为该记忆类再根据该记忆类属性生成Control控件例子而对于Control控件些事件、思路方法则可以继续使用

Tags:  xml序列化 对象序列化 java序列化 序列化

延伸阅读

最新评论

发表评论