2012-03-15 2 views
1

Хорошо, если у меня есть класс, как это ...Serialize «это»

[serializable] 
public class MyClass() : ISerializable 
{ 
    public Dictionary<string, object> Values {get; set;} 
} 

Я знаю, что я должен сделать, чтобы сериализовать (ответ для тех, кто пытается найти быстрый ответ, является это) ...

protected MyClass(SerializationInfo info, StreamingContext context) 
{ 
    Values = (Dictionary<string, object>)info.GetValue("values", typeof(Dictionary<string, object>)); 
} 

public void GetObjectData(SerializationInfo info, StreamingContext context) 
{ 
    info.AddValue("values", Values); 
} 

Мой вопрос: что делать, если, вместо этого, я хотел определенного класса, унаследованного от словаря?

Я получаю это далеко ...

[serializable] 
public class MyClass() : Dictionary<string, object>, ISerializable 
{ 
    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
    info.AddValue("me", this); 
    } 
} 

но потом заблудились. Я не могу это написать ...

protected MyClass(SerializationInfo info, StreamingContext context) 
{ 
    this = (MyClass)info.GetValue("me", typeof(MyClass)); 
} 

'cos' это 'r/o. Итак, как я могу продолжить? Я даже прав о реализации GetObjectData()?

Я не считаю, что это будет иметь значение, но только в случае, если это произойдет, я пишу это под .Net 4.0

+0

Почему вы внедряете 'ISerializable' вообще? Сериализация по умолчанию работает почти для всех и% 90 из реализаций ISerializable, которые я когда-либо видел, от людей, которые еще этого не осознали. – Yaur

+0

@Yaur a: ** требуется ** при наследовании от чего-то вроде словаря (хотя я бы утверждал, что инкапсуляция - лучшая идея); что сказал: b: лично я стараюсь не слишком рекомендовать BinaryFormatter - у него есть ... Kinks. –

+0

@Yaur. Если я этого не сделаю, я получу исключение, как только попытаюсь десериализовать экземпляр класса. I/have/для реализации ISerializable, если я использую словарь в своем классе. –

ответ

6

Dictionary<T, V> уже реализует ISerializable (см this). Поэтому просто вызовите методы в базовом классе:

public class MyClass() : Dictionary<string, object> 
{ 
     protected MyClass(SerializationInfo info, StreamingContext context) 
      : base(info, context) // Call the constructor in Dictionary 
     { 
     // instantiate other properties you had added to MyClass. 
     } 

     public void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
     base.GetObjectData(info, context); 
     // Now add other fields that MyClass implements. 
     info.AddValue("whatever", this.AnotherProperty); 
     } 
} 
+0

не шутите ?! Bu99er! Наверное, я просто недостаточно читал! В моей собственной защите я понял только 25% того, что я читал по этой теме! Спасибо, парень. –