Csharp/C Sharp/Class Interface/ISerializable — различия между версиями

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

Текущая версия на 11:39, 26 мая 2010

Custom Serialization using ISerializable

 
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);
    }
}