Поделиться через


ISerializable Интерфейс

Определение

Позволяет объекту управлять собственной сериализацией и десериализацией с помощью двоичной и 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
Производный
Атрибуты

Комментарии

Любой класс, который может быть сериализован с помощью двоичной или XML-сериализации, должен быть помечен с SerializableAttributeпомощью . Если классу необходимо управлять процессом двоичной или XML-сериализации, он может реализовать ISerializable интерфейс . Вызывает FormatterGetObjectData во время сериализации и заполняет предоставленный SerializationInfo всеми данными, необходимыми для представления объекта . Создает Formatter объект SerializationInfo с типом объекта в графе. Объекты, которым необходимо отправлять прокси-серверы для себя, могут использовать FullTypeName методы и AssemblyName для SerializationInfo изменения передаваемых данных.

В случае наследования классов можно сериализовать класс, производный от базового класса, реализующего ISerializable. В этом случае производный класс должен вызывать реализацию базового класса внутри GetObjectData своей реализации GetObjectData. В противном случае данные из базового класса не будут сериализованы.

Интерфейс ISerializable подразумевает конструктор с сигнатурой constructor (SerializationInfo information, StreamingContext context). Во время десериализации текущий конструктор вызывается только после десериализации данных в SerializationInfo методе форматирования. Как правило, этот конструктор должен иметь значение protected , если класс не sealedявляется .

Порядок десериализации объектов не может быть гарантирован. Например, если один тип ссылается на тип, который еще не был десериализован, возникнет исключение. При создании типов с такими зависимостями можно обойти проблему, реализовав IDeserializationCallback интерфейс и OnDeserialization метод .

Архитектура сериализации обрабатывает типы объектов, которые расширяются MarshalByRefObject так же, как типы, расширяющие Object. Эти типы можно пометить с помощью SerializableAttribute и реализовать ISerializable интерфейс как любой другой тип объекта. Их состояние объекта будет записано и сохранено в потоке.

Если эти типы используются через System.Runtime.Remoting, инфраструктура удаленного взаимодействия предоставляет суррогат, который вытесняет типичную сериализацию и вместо этого сериализует прокси-сервер в MarshalByRefObject. Суррогат — это помощник, который знает, как сериализовать и десериализовать объекты определенного типа. Прокси-сервер, невидимый для пользователя в большинстве случаев, будет иметь тип ObjRef.

Как общий конструктивный шаблон, было бы необычно, чтобы класс помечался с помощью сериализуемого атрибута и расширял MarshalByRefObject. При объединении этих двух характеристик разработчикам следует тщательно продумать возможные сценарии сериализации и удаленного взаимодействия. Один из примеров, где это может быть применимо, — с .MemoryStream Хотя базовый MemoryStream класс (Stream) расширяется от MarshalByRefObject, можно записать состояние MemoryStream объекта и восстановить его по мере необходимости. Таким образом, может быть полезно сериализовать состояние этого потока в базу данных и восстановить его позже. Однако при использовании через удаленное взаимодействие объект этого типа будет находиться через прокси-сервер.

Дополнительные сведения о сериализации классов, расширяющих MarshalByRefObject, см. в разделе RemotingSurrogateSelector. Дополнительные сведения о реализации ISerializableсм. в разделе Настраиваемая сериализация.

Примечание

Этот интерфейс не применяется к сериализации JSON с помощью System.Text.Json.

Примечания для тех, кто реализует этот метод

Реализуйте этот интерфейс, чтобы позволить объекту принимать участие в собственной сериализации и десериализации.

Методы

GetObjectData(SerializationInfo, StreamingContext)
Устаревшие..

Заполняет объект SerializationInfo данными, необходимыми для сериализации целевого объекта.

Применяется к

См. также раздел