任何可能要序列化的類別必須使用 SerializableAttribute 加以標記。如果某類別需要控制它自己的序列化程序,則它可以實作 ISerializable 介面。Formatter 會在序列化時呼叫 GetObjectData,並將表示物件所需的所有資料填入提供的 SerializationInfo 中。Formatter 會使用 Graph 中的物件型別建立 SerializationInfo。需要為自己傳送 Proxy 的物件可以使用在 SerializationInfo 上的 FullTypeName 和 AssemblyName 方法來變更所傳輸的資訊。
若為類別繼承關係,可以序列化衍生自實作 ISerializable 之基底類別 (Base Class) 的類別。在這種情況下,衍生類別 (Derived Class) 應該在其 GetObjectData 的實作中呼叫 GetObjectData 的基底類別實作。否則,不會序列化基底類別的資料。
ISerializable 介面表示具有簽章建構函式的建構函式 (SerializationInfo 資訊,StreamingContext 內容)。在還原序列化期間,目前的建構函式只有在 SerializationInfo 中的資料已經由格式子 (Formatter) 還原序列化後才呼叫。如果類別不是密封的,則通常應該保護這個建構函式。
無法保證還原序列化物件的順序。例如,如果一種型別參考尚未還原序列化的型別,則會發生例外狀況。如果您正在建立具有這樣相依性的型別,則可透過實作 IDeserializationCallback 介面和 OnDeserialization 方法解決這個問題。
序列化架構以處理擴充 Object 的型別的相同方式來處理擴充 MarshalByRefObject 的物件型別。這些型別可以使用 SerializableAttribute 加以標記,並將 ISerializable 介面實作為任何其他的物件型別。它們的物件狀態將會擷取並保存至資料流上。
當這些型別透過 System.Runtime.Remoting 使用時,遠端基礎結構會提供代理,該代理會優先於一般序列化,並改將 Proxy 序列化至 MarshalByRefObject。代理是知道如何序列化和還原序列化特定型別物件的 Helper。在多數狀況中無法為使用者所見的 Proxy 將屬於型別 ObjRef。
做為一般的設計模式,如果類別是使用可序列化屬性和延伸 MarshalByRefObject 加以標記,則狀況不尋常。開發人員應該在結合這兩個特性時,仔細思考可能的序列化和遠端案例。這種狀況的類似範例是使用 MemoryStream。當 MemoryStream ( Stream ) 的基底類別延伸自 MarshalByRefObject 時,有可能會擷取 MemoryStream 的狀態,並任意將它還原。因此,若要將這個資訊流的狀態序列化為資料庫並稍後還原才有意義。不過,如果這個型別的物件經由遠端使用,則將可以代理。
如需擴充 MarshalByRefObject 之類別序列化的詳細資訊,請參閱 RemotingSurrogateSelector。如需實作 ISerializable 的詳細資訊,請參閱 自訂序列化。
實作器注意事項實作這個介面,以便允許物件參與它自己的序列化和還原序列化。