序列化
来源:互联网 发布:linux建立用户 编辑:程序博客网 时间:2024/05/16 14:50
对于要序列化的类前面要加 [Serializable] 修饰
对于类中不能序列化或者不想要序列化的成员可以加 [NoSerializable] 修饰
二进制序列化如下:
IFormatter fm = new BinaryFormatter();
Stream stream ;
fm.Serialize(stream, tmp);
classt data = (class)fm.Deserialize(stream);
SOAP格式器可以输出xml文件
只要将上述代码中的 BinaryFormatter 改为 SoapFormatter 类
对于流可以是任何流
比如:FileStream 或者MemoryStream 等等
序列化和发序列化时,读取和存储都是在流的当前位置
所以在正确的文职,才能得到正确的数据(否则很可能抛出异常)
对于一些序列化时需要加密的信息(如信用卡号等) 并不适用明文序列化
这个时候要继承 ISerializable 接口,这个接口定义了GetObjectData() 方法
当一个类被序列化时,首先查看是否继承了这个接口,如果有,则调用GetObjectData()这个方法
同样,在反序列化时,必须有一个构造函数与之对应,参数为(SerializationInfo info, StreamingContext context)
这个构造函数最好为protected 可以被继承,但是外界方法无法调用。
有代码有真相:
public class data : ISerializable
{
private int i = 0;
public virtual void GetObjectData(SerializationInfo info, StreamingContext context) {
info.AddValue("i", 10); //对i进行操作加密,这里设置为10......
}
protected data(SerializationInfo info, StreamingContext context) {
i = info.GetInt32("i");
}
public data() { }
}
stream = new FileStream(@"d:/obj.bin", FileMode.Create, FileAccess.Write);
using (stream) {
fm.Serialize(stream, tmp);
}
stream = new FileStream(@"d:/obj.bin", FileMode.Open, FileAccess.Read);
using (stream) {
data t = (data)fm.Deserialize(stream);
}
当类是泛型的时候,可接受一个类型参数
info.AddValue("m_t",m_t,typeof(T) );
m_t = (T)info.GetValue("m_t",typeof(T) );