为什么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的一个例子中,它们填充objreturn null

为什么isserialize代理.SetObject返回一个对象,并接受一个对象来填充

查看这篇。net专栏文章:http://msdn.microsoft.com/en-us/magazine/cc188950.aspx

它说:

注意SetObjectData方法有一个返回类型Object。这将使您认为SetObjectData实际上可以返回对完全不同类型对象的引用。然而,Microsoft SoapFormatter和BinaryFormatter类型完全忽略这个返回值,这就是我在前面的示例中返回null的原因。很明显,这里有一个bug;返回值应该允许SetObjectData返回一个不同的对象。

微软已经安排修复这个bug。如果返回值为空,那么格式化程序将使用它传递给SetObjectData的对象。如果SetObjectData返回一个对象引用,那么格式化程序将使用返回的对象。不幸的是,在这个错误被修复之前,你不能反序列化一个值类型。