none
Как сериализовать класс, который имеет статические свойства? RRS feed

  • Общие обсуждения

  • Во-первых xml сериализация возможно с помощью BinaryFormatter или SoapFormatter .

    Следующие шаги показывают, как можно сериализовать класс, который имеет статические поля:

    1. Нужно, чтобы класс реализовывал интерфейс ISerializable и отметить класс атрибутом Serializable
    2. Написать реализацию функции GetObjectData
    3. Создать новый конструктор с той же сигнатурой, что и GetObjectData

    Во время сериализации происходит вызов метода GetObjectData. Во время десериализации класс вызывает соответствующий конструктор для создания объекта.

    Например:

      [Serializable]
      public class MyClass : ISerializable 
      {
        static int? sindex;
        static int? len;
    
        public static int? StartIndex
        {
          get { return sindex; }
          set { sindex = value; }
        }
        public static int? Length
        {
          get { return len; }
          set { len = value; }
        }
    
        public MyClass()
        { }
    
        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
          info.AddValue("static.sindex", MyClass.sindex, typeof(int));
          info.AddValue("static.len", MyClass.len, typeof(int));
        }
    
        public MyClass(SerializationInfo info, StreamingContext context)
        {
          MyClass.sindex = info.GetInt32("static.sindex");
          MyClass.len = info.GetInt32("static.len");
        }
      }
    
    

    Код сериализации/десериализации:

        private void BinarySerialize()
        {
          FileStream fileStream = new FileStream("test.binary", FileMode.Create);
          BinaryFormatter bf = new BinaryFormatter();
          bf.Serialize(fileStream, myClass);
          fileStream.Dispose();
        }
        private void BinaryDeserialize()
        {
          FileStream fileStream = new FileStream("test.binary", FileMode.Open);
          BinaryFormatter bf = new BinaryFormatter();
          MyClass myClass = (MyClass)bf.Deserialize(fileStream);
          MessageBox.Show(MyClass.StartIndex.HasValue.ToString());
          MessageBox.Show(MyClass.StartIndex.Value.ToString());
        }
        private void SoapSerialize()
        {
          FileStream fileStream = new FileStream("test.soap", FileMode.Create);
          SoapFormatter sf = new SoapFormatter();
          sf.Serialize(fileStream, myClass);
          fileStream.Dispose();
        }
        private void SoapDeserialize()
        {
          FileStream fileStream = new FileStream("test.soap", FileMode.Open);
          SoapFormatter sf = new SoapFormatter();
          MyClass myClass = (MyClass)sf.Deserialize(fileStream);
          MessageBox.Show(MyClass.StartIndex.HasValue.ToString());
          MessageBox.Show(MyClass.StartIndex.Value.ToString());
        }
    
    

     


    Для связи [mail]
    1 февраля 2011 г. 14:58