Udostępnij za pośrednictwem


ISerializable Interfejs

Definicja

Umożliwia obiektowi kontrolowanie własnej serializacji i deserializacji za pomocą serializacji binarnej i XML.

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
Pochodne
Atrybuty

Uwagi

Każda klasa, która może być serializowana przy użyciu serializacji binarnej lub XML, musi być oznaczona za pomocą .SerializableAttribute Jeśli klasa musi kontrolować proces serializacji binarnej lub XML, może zaimplementować ISerializable interfejs. Metoda Formatter wywołuje metodę GetObjectData w czasie serializacji i wypełnia dostarczone SerializationInfo ze wszystkimi danymi wymaganymi do reprezentowania obiektu. Obiekt Formatter tworzy SerializationInfo obiekt z typem obiektu na grafie. Obiekty, które muszą wysyłać serwery proxy dla siebie, mogą używać FullTypeName metod i AssemblyName w SerializationInfo celu zmiany przesyłanych informacji.

W przypadku dziedziczenia klas można serializować klasę, która pochodzi z klasy bazowej, która implementuje ISerializable. W tym przypadku klasa pochodna powinna wywołać implementację klasy bazowej GetObjectData wewnątrz implementacji klasy GetObjectData. W przeciwnym razie dane z klasy bazowej nie będą serializowane.

Interfejs ISerializable implikuje konstruktor z podpisem constructor (SerializationInfo information, StreamingContext context). W czasie deserializacji bieżący konstruktor jest wywoływany tylko wtedy, gdy dane w obiekcie SerializationInfo zostały zdeserializowane przez program formatujący. Ogólnie rzecz biorąc, ten konstruktor powinien być protected , jeśli klasa nie sealedjest .

Nie można zagwarantować kolejności deserializacji obiektów. Jeśli na przykład jeden typ odwołuje się do typu, który nie został jeszcze deserializowany, wystąpi wyjątek. Jeśli tworzysz typy, które mają takie zależności, możesz obejść problem, implementując IDeserializationCallback interfejs i metodę OnDeserialization .

Architektura serializacji obsługuje typy obiektów, które rozszerzają MarshalByRefObject te same typy, co typy rozszerzające Object. Te typy można oznaczyć za pomocą SerializableAttribute elementu i zaimplementować ISerializable interfejs jako dowolny inny typ obiektu. Ich stan obiektu zostanie przechwycony i utrwalone na strumieniu.

Gdy te typy są używane za pośrednictwem System.Runtime.Remotingprogramu , infrastruktura komunikacji sieciowej zapewnia zastępcze, które poprzedza typową serializacji, a zamiast tego serializuje serwer proxy do MarshalByRefObject. Zastępca to pomocnik, który wie, jak serializować i deserializować obiekty określonego typu. Serwer proxy niewidoczny dla użytkownika w większości przypadków będzie mieć typ ObjRef.

Jako ogólny wzorzec projektowania byłoby nietypowe, aby klasa była oznaczona atrybutem z możliwością serializacji i rozszerzała wartość MarshalByRefObject. Deweloperzy powinni dokładnie zastanowić się nad możliwymi scenariuszami serializacji i komunikacji zdalnie podczas łączenia tych dwóch cech. Jednym z przykładów, w których może to dotyczyć, jest element z elementem MemoryStream. Chociaż klasa podstawowa MemoryStream (Stream) rozciąga się od MarshalByRefObjectklasy , można przechwycić stan elementu MemoryStream i przywrócić go w woli. W związku z tym może to mieć znaczenie dla serializacji stanu tego strumienia do bazy danych i przywrócenia go w późniejszym czasie. Jednak w przypadku użycia za pośrednictwem komunikacji zdalnie obiekt tego typu będzie proxied.

Aby uzyskać więcej informacji na temat serializacji klas, które rozszerzają MarshalByRefObjectprogram , zobacz RemotingSurrogateSelector. Aby uzyskać więcej informacji na temat implementowania ISerializableprogramu , zobacz Custom Serialization (Serializacja niestandardowa).

Uwaga

Ten interfejs nie ma zastosowania do serializacji JSON przy użyciu polecenia System.Text.Json.

Uwagi dotyczące implementowania

Zaimplementuj ten interfejs, aby umożliwić obiektowi udział we własnej serializacji i deserializacji.

Metody

GetObjectData(SerializationInfo, StreamingContext)
Przestarzałe.

Wypełnia element SerializationInfo danymi wymaganymi do serializacji obiektu docelowego.

Dotyczy

Zobacz też