我打算使用序列化來進行克隆。我必須讓我的班級變得可愛。但是它的超類和所有引用的變量類呢?我是否需要使它們都可以被ISerializable?C#ISerializable問題
如果我使用ISerializable。我必須實現GetObjectData(),我應該在該方法中放置什麼?把它留空是好的?
我打算使用序列化來進行克隆。我必須讓我的班級變得可愛。但是它的超類和所有引用的變量類呢?我是否需要使它們都可以被ISerializable?C#ISerializable問題
如果我使用ISerializable。我必須實現GetObjectData(),我應該在該方法中放置什麼?把它留空是好的?
除非您將與 [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需要反序列化。如果你把它留空,你的物體就不會有願望值。
有兩種方法可以讓你的類型在.Net中可序列化。
最簡單和最簡單的方法是標記您的類型,它與層次結構中的所有關聯類型以及具有Serializable
屬性的所有類型的所有字段類型。這似乎很多,但對於小對象層次結構,它不能很快完成。這種方法的好處在於,你不必爲序列化做任何其他工作。您只需聲明類型是可序列化的,而CLR則完成剩餘的工作。
另一種方法是在層次結構中的所有類型上實現ISerializable
。但是,所有這些都是聲明你的類型是可序列化的。您實際上必須實現ISerializable
上的方法才能手動序列化值。一般來說,這種方法需要更多的工作,並增加了維護成本,因爲當字段被添加或從類型中刪除時,您必須不斷更新它。如果您不控制層次結構中的所有類型,則可能有必要
根據您的方案,我會去Serializable
屬性路線,除非您有使用ISerializable
的非常具體的原因。
我試圖做的是使用這種方法來做克隆:http://stackoverflow.com/questions/78536/cloning-objects-in-c。如果我需要定義所有的GetObjectData方法,最好定義我自己的Clone方法。 – 5YrsLaterDBA 2010-03-19 17:14:20
您可以簡單地在類的上方添加[Serializable]標籤。這樣你的對象將是可序列化的。使用Clone()方法,就像您發送給我的鏈接一樣,您應該開展業務:) – 2010-03-19 17:16:39
您的blockquote使用「GetDataObject」,而您的代碼和其他文本具有「GetObjectData」。這兩種分開的方法,還是僅僅是一個錯字? – 2010-03-19 17:26:39