.NET商务应用或者说企业开发的核心, 是数据,数据的状态转化以及数据流. 这里的数据,泛指一切在各个服务或者逻辑模块间进行传递的数据,消息及Operation. 对于数据来说, 持久化永远是不可能被回避的话题. 原因在于,
- 第一, 业务要求数据可以回溯,该可以回溯的数据可以用来统计或者billing;
- 第二, 异常控制的Restore需要异常发生时的Context;
- 第三, 关键/敏感数据需要安全性保证.
数据的持久化要求序列化, 笔者这是序列化存在的主要意义. 实际上, 序列化就是按照一定函数关系由一个实体映射到一段字节组合的过程, 本质意义是讲关系型数据转换为自描述(用于反序列化)的字节组合.从数据传输的角度来说,序列化及反序列化技术是不同进程间对象数据传输的底层实现保证, 这也是序列化技术存在的另一个主要意义.
从.NET大规模应用于企业开发企业应用的时候开始, 序列化和反序列化技术就成为一个热点. 我在这里不想再去重新争论.NET 序列化技术的优劣及限制, 只是作为写在这个地方的第一篇技术文档,整理关于.NET序列化的实现方法,写下一些心得,高手请绕行哈;)
要实现对象的序列化,首先要保证该对象可以序列化。不是每一个类都可以进行序列化, 只有被标记了SerializableAttribute的类才能被序列化.例如而且,序列化只是将对象的属性进行有效的保存,对于对象的一些方法则无法实现序列化的。
实现一个类可序列化的最简便的方法就是增加Serializable属性标记类。如:
[Serializable]
public class SerializationSample
{
private int id;
[NonSerializable]
private int encryptKey;
public string Description;
public SerializationSample()
{
}
}
- 使用[Serializable]标签标记想要进行序列化的类;
- 私有属性同样可能会被进行序列化(取决于采用的序列化方法);
- 标记有NonSerializableAttribute属性的成员将不能被序列化.
序列化方法的选择:
.NET的类库为序列化提供了两种方法供程序作者使用, XML序列化或者二进制序列化.
1、XML序列化
使用 XmLSerializer 类,可将下列项序列化。
- 公共类的公共读/写属性和字段;
- 实现 ICollection 或 IEnumerable 的类。(注意只有集合会被序列化,而公共属性却不会。
- XmlElement 对象。
- XmlNode 对象。
- DataSet 对象。
要实现上述类的实例的序列化,可参照如下例子:
SerializationSample sample= new SerializationSample();
XmlSerializer mySerializer = new XmlSerializer(typeof(SerializationSample));
StreamWriter myWriter = new StreamWriter("xxx.xml");
mySerializer.Serialize(myWriter, SerializationSample);
需要注意的是XML序列化只会将public的字段保存,对于私有字段不予于保存。
生成的XML文件格式如下:
<SerializationSample>
<Description>Test</Description>
</SerializationSample>
对于对象的反序列化,则如下:
SerializationSample sample;
XmlSerializer mySerializer = new XmlSerializer(typeof(SerializationSample));
FileStream myFileStream = new FileStream("xxx.xml", FileMode.Open);
sample= (SerializationSample)mySerializer.Deserialize(myFileStream)
2、二进制序列化
与XML序列化不同的是,二进制序列化可以将类的实例中所有字段(包括私有和公有)都进行序列化操作。这就更方便、更准确的还原了对象的副本。
要实现上述类的实例的序列化,可参照如下例子:
SerializationSample sample= new SerializationSample();
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("xxx.bin",FileMode.Create,FileAccess.Write, FileShare.None);
formatter.Serialize(stream, sample);
stream.Close();
对于对象的反序列化,则如下:
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("xxx.bin", FileMode.Open,FileAccess.Read, FileShare.Read);
SerializationSample sample= (SerializationSample)formatter.Deserialize(stream);
stream.Close();
写了这些简单的整理, 至于序列化方法的自定义话题,等做了实验以后再贴.