2013-08-07 40 views
3

我想在C#中實現一個通用的Memento-Pattern。它工作正常,但我使用Serializeable()屬性來做一個對象的深層副本。我使用泛型的實現,所以如果有人使用它,他必須把他的類作爲類型。 現在來自用戶的類也必須具有Attribute Serializeable()。使用Serializeable()的類是否有任何限制?C#序列化限制

事實上:

  1. 是否有任何性能問題?
  2. 是否可以使用接口?
  3. 是否有可能使用無線網卡?
  4. 是否可以使用自動屬性?

我不知道Attribute是如何工作的,所以iam有點可怕地用這樣的全局方式來使用它。

問候

回答

5
  1. 爲您克隆在內存中,通常不
  2. 無關緊要的小模型;當使用[Serializable]時,您通常會使用BinaryFormatter - 它會自己查看對象;這不要緊,他們實現了什麼接口 - 不使用
  3. 是,出於同樣的原因接口 - 但模型中的所有類型必須[Serializable]
  4. 是,出於同樣的原因;注意:默認BinaryFormatter實現望着領域 - 它甚至不會觸及性

就個人而言,我設法勸BinaryFormatter,但這也許不是不合理使用。然而!注意容易將多餘的物體意外吸入模型中,通常必須通過event s。需要注意的是,以紀念所有event S作爲非序列化是一個好主意:

[field:NonSerialized] 
public event EventHandler Something; 

(或直接,如果使用顯式add/remove存取應用到該字段)

還要注意,就像任何成員:

public object Tag {get;set;} // caller-defined 

也應該是[field:NonSerialized]

就我個人而言,我會寧願不同的序列化程序,但:這往往會起作用。但我會這樣說:儘量避免持續的輸出BinaryFormatter,因爲很難保證代碼版本之間的兼容性。

我不知道屬性如何工作

它除添加IL標誌,上面寫着所有什麼「的方式,認爲這是確定要進行序列化」;實際上,大多數串行器甚至不看這個標誌 - 但是BinaryFormatter做的那幾個看看這個標誌。這裏的真實代碼是BinaryFormatter,基本上這樣做:

  • 我以前見過這個對象嗎?如果是這樣,只存儲密鑰
  • 它是什麼類型?是[Serializable]?存儲類型信息
  • 發明一個新的參考和存儲,作爲身份
  • 它有一個自定義序列化程序嗎?如果是這樣的話:使用
  • 它有什麼字段?依次訪問並存儲名稱/值對
+0

完美!非常感謝 :-) – Sebi