我最近在查看运行时序列化并遇到了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中,他们会填充obj
和return null
。
答案 0 :(得分:6)
查看此.NET专栏文章:http://msdn.microsoft.com/en-us/magazine/cc188950.aspx
它说:
请注意,SetObjectData方法的返回类型为Object。这会让您认为SetObjectData实际上可以返回对完全不同类型的对象的引用。但是,Microsoft SoapFormatter和BinaryFormatter类型完全忽略此返回值,这就是我在前一个示例中返回null的原因。显然,这里有一个错误;返回值应允许SetObjectData返回不同的对象。
Microsoft已安排此错误进行修复。如果返回值为null,则格式化程序将使用它传递给SetObjectData的对象。如果SetObjectData返回对象引用,则格式化程序将使用返回的对象。不幸的是,在修复此错误之前,您无法反序列化值类型。