Csharp/C Sharp/Class Interface/ISerializable

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Custom Serialization using ISerializable

<source lang="csharp"> using System; using System.Collections.Generic; using System.Text; using System.Runtime.Serialization; using System.Text; using System.IO; using System.Runtime.Serialization.Formatters.Soap;

[Serializable] class MyStringData : ISerializable {

   public string dataItemOne, dataItemTwo;
   public MyStringData() { }
   private MyStringData(SerializationInfo si, StreamingContext ctx) {
       dataItemOne = si.GetString("First_Item").ToLower();
       dataItemTwo = si.GetString("dataItemTwo").ToLower();
   }
   void ISerializable.GetObjectData(SerializationInfo info, StreamingContext ctx) {
       // Fill up the SerializationInfo object with the formatted data.
       info.AddValue("First_Item", dataItemOne.ToUpper());
       info.AddValue("dataItemTwo", dataItemTwo.ToUpper());
   }

} [Serializable] class MoreData {

   public string dataItemOne, dataItemTwo;
   [OnSerializing]
   internal void OnSerializing(StreamingContext context) {
       dataItemOne = dataItemOne.ToUpper();
       dataItemTwo = dataItemTwo.ToUpper();
   }
   [OnDeserialized]
   internal void OnDeserialized(StreamingContext context) {
       dataItemOne = dataItemOne.ToLower();
       dataItemTwo = dataItemTwo.ToLower();
   }

} class Program {

   static void Main(string[] args) {
       MyStringData sd = new MyStringData();
       sd.dataItemOne = "some data.";
       sd.dataItemTwo = "some more data";
       Stream s = new FileStream("MyData.soap",
       FileMode.Create, FileAccess.Write, FileShare.None);
       SoapFormatter sf = new SoapFormatter();
       sf.Serialize(s, sd);
       s.Close();
       s = File.OpenRead("MyData.soap");
       sd = (MyStringData)sf.Deserialize(s);
       Console.WriteLine("Item 1: {0}", sd.dataItemOne);
       Console.WriteLine("Item 2: {0}", sd.dataItemTwo);
       MoreData md = new MoreData();
       md.dataItemOne = "1, 2, 3.";
       md.dataItemTwo = "One more test...";
       s = new FileStream("MoreData.soap",FileMode.Create, FileAccess.Write, FileShare.None);
       sf = new SoapFormatter();
       sf.Serialize(s, md);
       s.Close();
       s = File.OpenRead("MoreData.soap");
       md = (MoreData)sf.Deserialize(s);
       Console.WriteLine("Item 1: {0}", md.dataItemOne);
       Console.WriteLine("Item 2: {0}", md.dataItemTwo);
   }

}

</source>