使用ISerializationSurrogate时如何创建对象?

时间:2018-07-21 08:14:54

标签: c# serialization deserialization binary-serialization

我使用ISerializationSurrogate。在object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)中,obj将是空的新对象。

MSDN说:

在反序列化过程中将调用SetObjectData方法。使用这种方法,您可以获取已经创建的空Object obj,然后在该对象中输入SerializationInfo info data。在信息反序列化和对象重建期间,不会调用构造函数。

我的问题是:如何创建对象?也许有人可以将我指向发生这种情况的http://www.sourceof.net处的代码?

1 个答案:

答案 0 :(得分:2)

该对象是通过FormatterServices.GetUninitializedObject方法创建的。调用它的代码是here

GetUninitializedObject的实现在CLR本身很深,如果您真的有兴趣,可以查看源here

如果您有对象的源要反序列化,则最好实现ISerializable并使用特殊的构造函数,因为您可以从那里设置只读字段。使用代理时,您只能通过反射设置只读字段,这不仅速度慢,而且需要完全信任权限。