为什么ISerializationSurrogate.SetObject返回一个对象以及一个对象填充?

时间:2011-10-11 09:02:34

标签: c# serialization runtime

我最近在查看运行时序列化并遇到了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中的一个example中,他们会填充objreturn null

1 个答案:

答案 0 :(得分:6)

查看此.NET专栏文章:http://msdn.microsoft.com/en-us/magazine/cc188950.aspx

它说:

  

请注意,SetObjectData方法的返回类型为Object。这会让您认为SetObjectData实际上可以返回对完全不同类型的对象的引用。但是,Microsoft SoapFormatter和BinaryFormatter类型完全忽略此返回值,这就是我在前一个示例中返回null的原因。显然,这里有一个错误;返回值应允许SetObjectData返回不同的对象。

     

Microsoft已安排此错误进行修复。如果返回值为null,则格式化程序将使用它传递给SetObjectData的对象。如果SetObjectData返回对象引用,则格式化程序将使用返回的对象。不幸的是,在修复此错误之前,您无法反序列化值类型。