【问题标题】: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 关于私有字段的反射和更改的问答。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-01
        • 2013-12-27
        • 1970-01-01
        • 2010-10-09
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多