2012-03-15 53 views
1

OK,如果我有這樣一類...序列化「這」

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

我的問題是我該怎麼做,而是,我想要定義一個繼承自Dictionary的類?

我走到這一步......

[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'this'is r/o。那麼,我將如何繼續?我甚至正確的實施GetObjectData()?

我不相信它一定會有所作爲,但以防萬一它,我在.NET 4.0

+0

爲什麼要實現'ISerializable'呢?默認的序列化幾乎適用於所有的事情,我所見過的ISerializable實現中的%90都來自那些還沒有意識到的人。 – Yaur 2012-03-15 23:46:56

+0

@Yaur a:從類似字典的東西繼承時,**是必需的**(儘管我認爲封裝是一個更好的主意);這就是說,b:我個人儘量不要過度推薦BinaryFormatter - 它有...扭曲。 – 2012-03-15 23:51:03

+0

@Yaur。如果我不這樣做,只要嘗試反序列化類實例,就會收到異常。如果我在我的課堂上使用字典,我/有/實現ISerializable。 – 2012-03-15 23:58:09

回答

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%!哥們,謝啦。 – 2012-03-16 00:00:09