ISerializable Rozhraní

Definice

Umožňuje objektu řídit jeho 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

Každá třída, která může být serializována pomocí binárního nebo XML serializace musí být označena SerializableAttributepomocí . Pokud třída potřebuje řídit svůj binární nebo XML serializace proces, může implementovat ISerializable rozhraní. GetObjectData Volání Formatter v čase serializace a naplní dodanou SerializationInfo všechna data potřebná k reprezentaci objektu. Objekt Formatter vytvoří SerializationInfo typ objektu v grafu. Objekty, které potřebují odesílat proxy servery pro sebe, můžou ke změně přenášených informací použít FullTypeName metody SerializationInfo a AssemblyName .

V případě dědičnosti třídy je možné serializovat třídu, která je odvozena ze základní třídy, která implementuje ISerializable. V tomto případě by odvozená třída měla volat implementaci GetObjectData základní třídy 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 data v souboru SerializationInfo byla deserializována formátovacím nástrojem. 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 obejít implementací IDeserializationCallback rozhraní a OnDeserialization metody .

Architektura serializace zpracovává typy objektů, které rozšiřují MarshalByRefObject stejné jako typy, které rozšiřují Object. Tyto typy lze označit pomocí SerializableAttribute a implementovat ISerializable rozhraní jako jakýkoli jiný typ objektu. Stav jejich objektu se zaznamená a uloží do datového proudu.

Při použití těchto typů prostřednictvím System.Runtime.Remotingnástroje poskytuje infrastruktura vzdálené komunikace náhradu, která předchází typické serializaci a místo toho serializuje proxy server do .MarshalByRefObject Náhradní je pomocník, který ví, jak serializovat a deserializovat objekty určitého typu. Proxy server, který uživatel ve většině případů nevidí, 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 by to mohlo být použitelné, je .MemoryStream Zatímco základní třída MemoryStream (Stream) se rozšiřuje z MarshalByRefObject, je možné zachytit stav objektu MemoryStream a obnovit ho podle své vůle. Proto může být smysluplné serializovat stav tohoto streamu do databáze a později ho obnovit. Při použití prostřednictvím vzdálené komunikace by však objekt tohoto typu byl proxy.

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.

Poznámka

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

GetObjectData(SerializationInfo, StreamingContext)
Zastaralé.

Naplní SerializationInfo objekt daty potřebnými k serializaci cílového objektu.

Platí pro

Viz také