网站icon图标怎么设置,休闲食品网站建设策划书,引用评论框代码wordpress6,大二网页设计作业所谓的序列化就是是将对象转换为容易传输的格式的过程#xff0c;一般情况下转化打流文件#xff0c;放入内存或者IO文件中。例如#xff0c;可以序列化一个对象#xff0c;然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象#xff0c;或者和其它应用程序共享…所谓的序列化就是是将对象转换为容易传输的格式的过程一般情况下转化打流文件放入内存或者IO文件中。例如可以序列化一个对象然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象或者和其它应用程序共享使用。反之反序列化根据流重新构造对象。 .NET自带的有两种序列化对象的方式Xml和binary的XML 序列化不转换方法、索引器、私有字段或只读属性只读集合除外。要序列化对象的所有字段和属性公共的和私有的请使用 BinaryFormatter而不要使用 XML 序列化参见ms-help://MS.NETFramework.v20.chs/dv_fxserialization/html/8c63200d-db63-4a03-a93d-21641623df62.htmXML 和 SOAP 序列化。 两者的程序处理方式基本一致都是基于工厂模式的下面我就只说二进制的序列化的方式 例如我们有个对象 [Serializable]public class ClassToSerialize{ public int id100; public string nameName; } 需要序列化该对象必须在给该类加上Serializable的属性然后创建一个序列化写入的流FileStream fileStream new FileStream(temp.dat, FileMode.Create);然后创建二进制格式器BinaryFormatter bnew BinaryFormatter();然后是序列化b.Serialize(fileStream,c);然后关闭保存流。可以见下面的例子 读取一个已经被序列化的对象的时候操作方式一样只是FileStream fileStream new FileStream(temp.dat, FileMode.Open, FileAccess.Read, FileShare.Read); ClassToSerialize c (ClassToSerialize)b.Deserialize(fileStream); 然后就可以读取了完整的例子是using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; public class SerialTest{ public void SerializeNow(){ ClassToSerialize cnew ClassToSerialize(); FileStream fileStream new FileStream(temp.dat, FileMode.Create); BinaryFormatter bnew BinaryFormatter(); b.Serialize(fileStream,c); fileStream.Close(); } public void DeSerializeNow(){ ClassToSerialize cnew ClassToSerialize(); FileStream fileStream new FileStream(temp.dat, FileMode.Open, FileAccess.Read, FileShare.Read); BinaryFormatter bnew BinaryFormatter();//SoapFormatter c(ClassToSerialize)b.Deserialize(fileStream); Console.WriteLine(c.name); fileStream.Close(); } public static void Main(string[] s){ SerialTest stnew SerialTest(); st.SerializeNow(); st.DeSerializeNow(); } } [Serializable] public class ClassToSerialize{ public int id100; public string nameName; } 这就是自带的序列化和反序列的操作但是很多情况下一个对象比较大而且很多私有的属性和方法我们不需要例如在原型模式里面序列化的话只需要序列Clone方法和一些属性私有的方法无需要还例如在读取大规模的IO的时候读取操作完全不需要... 这时候就需要自己集成重写序列的ISerializable接口 实现该接口需要两个注意的一个就是构造函数主要是为了反序列另一个就是GetObjectData主要是执行序列化例如我们现在有一个Employee类需要序列化 [Serializable()] //Set this attribute to all the classes that want to serialize public class Employee : ISerializable //derive your class from ISerializable { public int EmpId; public string EmpName; [NonSerialized()] public string NoSerialStringNoSerialString-Test; } ,需要注意的是我这里的NoSerialString属性前面有[NonSerialized()]就是说默认并不序列化这个属性而是使用默认值 。 首先是构造函数 public Employee(SerializationInfo info, StreamingContext ctxt) { EmpId (int)info.GetValue(EmployeeId, typeof(int)); EmpName (String)info.GetValue(EmployeeName, typeof(string)); //NoSerialString (String)info.GetValue(NoSerialString, typeof(string)); } 然后是序列化方法就是当写入流的时候怎么保存的 public void GetObjectData(SerializationInfo info, StreamingContext ctxt) { //You can use any custom name for your name-value pair. But make sure you // read the values with the same name. For ex:- If you write EmpId as EmployeeId // then you should read the same with EmployeeId info.AddValue(EmployeeId, EmpId); info.AddValue(EmployeeName, EmpName); } 把上面两个方法写入到Employee类然后写个测试的程序 public class ObjSerial{ public static void Main(String[] args){ Employee mp new Employee(); mp.EmpId 10; mp.EmpName Omkumar; mp.NoSerialString 你好啊; //序列化 Stream stream File.Open(EmployeeInfo.osl, FileMode.Create); BinaryFormatter bformatter new BinaryFormatter(); Console.WriteLine(Writing Employee Information); bformatter.Serialize(stream, mp); stream.Close(); mp null; //反序列 stream File.Open(EmployeeInfo.osl, FileMode.Open); bformatter new BinaryFormatter(); Console.WriteLine(Reading Employee Information); mp (Employee)bformatter.Deserialize(stream); stream.Close(); Console.WriteLine(Employee Id: {0},mp.EmpId.ToString()); Console.WriteLine(Employee Name: {0},mp.EmpName); Console.WriteLine(Employee NoSerialString: {0},mp.NoSerialString); } } 执行的结果是Writing Employee Information Reading Employee Information Employee Id: 10 Employee Name: Omkumar Employee NoSerialString: NoSerialString-Test 看到Employee NoSerialString:属性的值没有它保持默认值没有序列化。 转载于:https://www.cnblogs.com/MaxWoods/archive/2008/03/15/1107873.html