序列化

来源:互联网 发布: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) );

原创粉丝点击