ISerializable Rozhraní
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Umožňuje objektu řídit vlastní serializace a deserializace prostřednictvím binární a XML serializace.
public interface class ISerializable
public interface ISerializable
[System.Runtime.InteropServices.ComVisible(true)]
public interface ISerializable
type ISerializable = interface
[<System.Runtime.InteropServices.ComVisible(true)>]
type ISerializable = interface
Public Interface ISerializable
- Odvozené
- Atributy
Poznámky
Všechny třídy, které mohou být serializovány pomocí binární nebo XML serializace musí být označeny SerializableAttribute. Pokud třída potřebuje řídit svůj binární nebo XML serializace procesu, může implementovat ISerializable rozhraní. Volání Formatter v GetObjectData době serializace a naplní dodané SerializationInfo všemi daty potřebnými k reprezentaci objektu. Vytvoří Formatter typ SerializationInfo objektu v grafu. Objekty, které potřebují odesílat proxy pro sebe, mohou použít FullTypeName a AssemblyName metody SerializationInfo ke změně přenášených informací.
V případě dědičnosti tříd je možné serializovat třídu, která je odvozena od základní třídy, která implementuje ISerializable. V tomto případě by odvozená třída měla volat základní třídu implementace GetObjectData uvnitř své implementace GetObjectData. V opačném případě nebudou data ze základní třídy serializována.
Rozhraní ISerializable implikuje konstruktor s podpisem constructor (SerializationInfo information, StreamingContext context). V době deserializace je aktuální konstruktor volán pouze po deserializaci dat v SerializationInfo rekonstruktoru. Obecně platí, že tento konstruktor by měl být protected , pokud třída není sealed.
Pořadí, ve kterém jsou objekty deserializovány, nelze zaručit. Pokud například jeden typ odkazuje na typ, který ještě nebyl deserializován, dojde k výjimce. Pokud vytváříte typy, které mají takové závislosti, můžete problém vyřešit implementací IDeserializationCallback rozhraní a OnDeserialization metody.
Architektura serializace zpracovává typy objektů, které rozšiřují MarshalByRefObject stejné typy jako typy, které rozšiřují Object. Tyto typy lze označit SerializableAttribute a implementovat rozhraní jako jakýkoli jiný typ objektu ISerializable . Jejich stav objektu se zachytí a zachytí do datového proudu.
Při použití System.Runtime.Remotingtěchto typů prostřednictvím , remoting infrastruktura poskytuje náhradní, která předpyší typické serializace a místo toho serializuje proxy na MarshalByRefObject. Náhradní je pomocník, který ví, jak serializovat a deserializovat objekty určitého typu. Proxy, neviditelný pro uživatele ve většině případů, bude typu ObjRef.
Jako obecný vzor návrhu by bylo neobvyklé, aby třída byla označena serializovatelným atributem a rozšířit MarshalByRefObject. Vývojáři by měli pečlivě zvážit možné scénáře serializace a vzdálené komunikace při kombinování těchto dvou charakteristik. Jedním z příkladů, kde to může být použitelné, je s MemoryStream. I když se základní třída MemoryStream (Stream) rozšiřuje od MarshalByRefObject, je možné zachytit stav a MemoryStream obnovit ho podle vůle. Proto může být smysluplné serializovat stav tohoto datového proudu do databáze a obnovit ho později v čase. Při použití prostřednictvím vzdálené komunikace by však byl objekt tohoto typuxiován.
Další informace o serializaci tříd, které rozšiřují MarshalByRefObject, naleznete v tématu RemotingSurrogateSelector. Další informace o implementaci ISerializablenaleznete v tématu Vlastní serializace.
Note
Toto rozhraní se nevztahuje na serializaci JSON pomocí System.Text.Json.
Poznámky pro implementátory
Implementujte toto rozhraní, aby se objekt mohl účastnit vlastní serializace a deserializace.
Metody
| Name | Description |
|---|---|
| GetObjectData(SerializationInfo, StreamingContext) |
Zastaralé.
Naplní SerializationInfo data potřebná k serializaci cílového objektu. |