2010-03-19 41 views
3

我打算使用序列化來進行克隆。我必須讓我的班級變得可愛。但是它的超類和所有引用的變量類呢?我是否需要使它們都可以被ISerializable?C#ISerializable問題

如果我使用ISerializable。我必須實現GetObjectData(),我應該在該方法中放置什麼?把它留空是好的?

回答

9

除非您將與 [Serializable]屬性類,這 接口必須由所有 類與序列化的情況下實現的。如果 想要你的類控制自己的 序列化和反序列化,請使用 ISerializable接口。

GetObjectData()讓你控制序列化過程。

GetDataObject,到你傳遞一個 的SerializationInfo對象和 的StreamingContext對象。該 GetDataObject方法然後 填充的SerializationInfo對象 與所需 序列化的目標對象的數據。

實施例:

public Employee(SerializationInfo info, StreamingContext ctxt) 
{ 
    //Get the values from info and assign them to the appropriate properties 
    EmpId = (int)info.GetValue("EmployeeId", typeof(int)); 
    EmpName = (String)info.GetValue("EmployeeName", typeof(string)); 
} 

public void GetObjectData(SerializationInfo info, StreamingContext ctxt) 
{ 
    //You can use any custom name for your name-value pair. But make sure you 
    // read the values with the same name. For ex:- If you write EmpId as "EmployeeId" 
    // then you should read the same with "EmployeeId" 
    info.AddValue("EmployeeId", EmpId); 
    info.AddValue("EmployeeName", EmpName); 
} 

上面的例子示出了如何並行化和串行。正如你可以看到GetObjectData需要反序列化。如果你把它留空,你的物體就不會有願望值。

+0

我試圖做的是使用這種方法來做克隆:http://stackoverflow.com/questions/78536/cloning-objects-in-c。如果我需要定義所有的GetObjectData方法,最好定義我自己的Clone方法。 – 5YrsLaterDBA 2010-03-19 17:14:20

+0

您可以簡單地在類的上方添加[Serializable]標籤。這樣你的對象將是可序列化的。使用Clone()方法,就像您發送給我的鏈接一樣,您應該開展業務:) – 2010-03-19 17:16:39

+0

您的blockquote使用「GetDataObject」,而您的代碼和其他文本具有「GetObjectData」。這兩種分開的方法,還是僅僅是一個錯字? – 2010-03-19 17:26:39

3

有兩種方法可以讓你的類型在.Net中可序列化。

最簡單和最簡單的方法是標記您的類型,它與層次結構中的所有關聯類型以及具有Serializable屬性的所有類型的所有字段類型。這似乎很多,但對於小對象層次結構,它不能很快完成。這種方法的好處在於,你不必爲序列化做任何其他工作。您只需聲明類型是可序列化的,而CLR則完成剩餘的工作。

另一種方法是在層次結構中的所有類型上實現ISerializable。但是,所有這些都是聲明你的類型是可序列化的。您實際上必須實現ISerializable上的方法才能手動序列化值。一般來說,這種方法需要更多的工作,並增加了維護成本,因爲當字段被添加或從類型中刪除時,您必須不斷更新它。如果您不控制層次結構中的所有類型,則可能有必要

根據您的方案,我會去Serializable屬性路線,除非您有使用ISerializable的非常具體的原因。