【问题标题】:How does DataContractSerializer write to private fields?DataContractSerializer 如何写入私有字段?
【发布时间】:2010-04-03 20:06:23
【问题描述】:
我了解 XMLSerializer 如何通过使用反射来确定应该使用哪些公共读/写字段或属性来序列化或反序列化 XML。然而 XMLSerializer 要求这些字段是公共的并且是读/写的。
但是,DataContractSerializer 能够读取或写入类中完全私有的字段。所以我想知道如果没有明确地赋予 DataContractSerializer 对我的类的额外访问权限,这怎么可能。
【问题讨论】:
标签:
c#
.net
xml
datacontractserializer
xmlserializer
【解决方案1】:
反射具有许多功能。 XmlSerializer 具有通过“sgen.exe”将序列化代码预构建为二进制 (dll) 的能力。这在某些不允许动态代码的情况下很有用,但 dll(就像您的代码一样)仅限于可访问的 API。
但是...反射并没有这个限制,并且只要有足够的访问权限,您几乎可以做任何事情。为了性能,您可能不想直接大量使用反射,但如果您有足够的权限直接在内存中创建 IL (DynamicMethod),那么您可以告诉它(根据-动态方法基础)与代码关联的Type。例如,如果我创建了一个DynamicMethod,将typeof(Foo) 作为owner 参数传递,那么该动态方法可以完全访问Foo 上的所有成员(包括字段)。有关信息,Delegate.CreateDelegate 提供对其他受保护数据的类似访问。由于DataContractSerializer不担心预生成,所以可以使用这个访问权限。
【解决方案2】:
它使用反射的方式与XMLSerializer 相同。
不同之处在于XMLSerializer 不会触及私有字段,但DataContractSerializer 会。
请参阅this SO 关于私有字段的反射和更改的问答。