语言

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 序列化进行序列化的类都必须用 /> 进行标记。 如果类需要控制其二进制或 XML 序列化过程,则可以实现 ISerializable 接口。 在 Formatter 序列化时调用 GetObjectData ,并使用表示对象所需的所有数据填充所提供的 SerializationInfo 数据。 使用 Formatter 图形中的对象类型创建一个 SerializationInfo 。 需要自行发送代理的对象可以使用 FullTypeName 和 AssemblyName 方法 SerializationInfo 更改传输的信息。

在类继承的情况下,可以序列化派生自实现 ISerializable的基类的类。 在这种情况下,派生类应调用其实现内部的GetObjectDataGetObjectData基类实现。 否则,不会序列化基类中的数据。

该 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的详细信息,请参阅 自定义序列化。

注释

此接口不适用于使用 System.Text.Json..

实施者说明

实现此接口以允许对象参与其自己的序列化和反序列化。

方法

名称 说明
GetObjectData(SerializationInfo, StreamingContext)
已过时.

使用序列化目标对象所需的数据填充数据 SerializationInfo 。

适用于

另请参阅