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 данными, необходимыми для сериализации целевого объекта. |