天天看点

序列化

二进制序列化需要的命名空间

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

二进制序列化

[Serializable]

public class Person

{

   public int age;

   piblic bool Sex

    {

      get;set;

    }

}

//序列化

 Person s=new Person();

 s.age=18;

 s.Sex=false;

 IFormatter formatter=new BinaryFormatter();//将序列化对象格式化

 Stream stream = new FileStream("E:/MyFile.txt", FileMode.Create, FileAccess.Write, FileShare.None);//用流接受内容

 fornatter.Serialize(stream,s);//序列化

 stream.close();//关闭流

//反序列化

 IFormatter formatter = new BinaryFormatter();

 Stream stream = new FileStream(@"E:/MyFile.txt",  FileMode.Open, FileAccess.Read, FileShare.Read);

 Person XiaoHong = (Person)formatter.Deserialize(stream);//反序列化

 stream.Close();

 Console.WriteLine((string.Format("年龄:{0} 性别:{1}", XiaoHong.age, XiaoHong.Sex)));

//选择序列化

    public class Person

        [NonSerialized]

       public int age;//在MyFile.txt中可以隐藏age

        public bool Sex

        { get; set; }

   }

                       自定义序列化

如果使用 Serializable 属性对某个类进行标记,且该类在类级别或对其构造函数具有声明性或强制性安全要求,则不应对该类执行默认的序列化。相反,这样的类应该始终实现 ISerializable 接口。

实现 ISerializable 涉及到实现 GetObjectData 方法以及反序列化对象时所用的特殊构造函数。

强调何时将 ISerializable 添加至必须同时实现 GetObjectData 和特殊构造函数的某个类,这一点很重要。如果缺少 GetObjectData,编译器会向您发出警告。但是,鉴于无法强制实现构造函数,如果不存在该构造函数,则不会发出任何警告,但此时如果尝试对某个类进行反序列化,将会引发异常。

 [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]——序列化可以允许其他代码查看或修改用其他方式无法访问的对象实例数据,本属性就是安全访问权限的设置。

SerializationInfo——存储将对象序列化或反序列化所需的全部数据。

StreamingContext——描述给定的序列化流的源和目标,并提供一个由调用方定义的附加上下文。

                       XML序列化

引用using System.Runtime.Serialization.Formatters.Soap;

例如:序列化

 Person XiaoHong = new Person();

            XiaoHong.age = 18;

            XiaoHong.Sex = false;        

            IFormatter formatter = new SoapFormatter();//将序列化对象格式化

Stream stream = new FileStream("F:/MyFile.xml", FileMode.Create, FileAccess.Write, FileShare.None);//用流接受内容

            formatter.Serialize(stream, XiaoHong);//序列化对象

            stream.Close();关闭流

反序列化

IFormatter formatter = new SoapFormatter();

            Stream stream = new FileStream("F:/MyFile.xml", FileMode.Open, FileAccess.Read, FileShare.Read);

            Person XiaoHong = (Person)formatter.Deserialize(stream);//反序列化

            stream.Close();

            MessageBox.Show(string .Format ("年龄:{0} 性别:{1}",XiaoHong .age ,XiaoHong .Sex ));

.NET Framework 提供了两个序列化技术:

1二进制序列化保持类型保真,这对于多次调用应用程序时保持对象状态非常有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等。远程处理使用序列化,“按值”在计算机或应用程序域之间传递对象。

2、XML 序列化只序列化公共属性和字段,并且不保持类型保真。当您希望提供或使用数据而不限制使用该数据的应用程序时,这一点非常有用。由于 XML 是开放式的标准,因此它对于通过 Web 共享数据来说是一个理想选择。SOAP 同样是开放式的标准,这使它也成为一个理想选择。

继续阅读