为什么isserialize代理.SetObject返回一个对象,并接受一个对象来填充
本文关键字:一个对象 填充 代理 SetObject 返回 为什么 isserialize | 更新日期: 2023-09-27 18:11:08
我最近在看运行时序列化,遇到了ISerializationSurrogate
接口。然而,我对它的SetObject
方法感到困惑。
签名是:
object SetObjectData(object obj, System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context, System.Runtime.Serialization.ISurrogateSelector selector)
,帮助信息为:
简介:
使用System.Runtime.Serialization.SerializationInfo中的信息填充对象。
参数:
obj:要填充的对象
info:填充对象的信息。
context:对象被反序列化的源。
selector:从这里开始搜索兼容的代理项。
的回报:
已填充的反序列化对象。
如果obj
是对象填充,为什么它返回The populated deserialized object
?在MSDN的一个例子中,它们填充obj
和return null
。
查看这篇。net专栏文章:http://msdn.microsoft.com/en-us/magazine/cc188950.aspx
它说:
注意SetObjectData方法有一个返回类型Object。这将使您认为SetObjectData实际上可以返回对完全不同类型对象的引用。然而,Microsoft SoapFormatter和BinaryFormatter类型完全忽略这个返回值,这就是我在前面的示例中返回null的原因。很明显,这里有一个bug;返回值应该允许SetObjectData返回一个不同的对象。
微软已经安排修复这个bug。如果返回值为空,那么格式化程序将使用它传递给SetObjectData的对象。如果SetObjectData返回一个对象引用,那么格式化程序将使用返回的对象。不幸的是,在这个错误被修复之前,你不能反序列化一个值类型。