我了解 XMLSerializer 如何通过使用反射来确定应该使用哪些公共读/写字段或属性来序列化或反序列化 XML。然而 XMLSerializer 要求这些字段是公共的并且是读/写的。
但是,DataContractSerializer 能够从类中的完全私有字段读取或写入。所以我想知道如果没有明确地赋予 DataContractSerializer 对我的类的额外访问权限,这怎么可能实现。
我了解 XMLSerializer 如何通过使用反射来确定应该使用哪些公共读/写字段或属性来序列化或反序列化 XML。然而 XMLSerializer 要求这些字段是公共的并且是读/写的。
但是,DataContractSerializer 能够从类中的完全私有字段读取或写入。所以我想知道如果没有明确地赋予 DataContractSerializer 对我的类的额外访问权限,这怎么可能实现。
反射有很多特点。XmlSerializer
具有通过“sgen.exe”将序列化代码预构建为二进制 (dll) 的能力。这在某些不允许动态代码的情况下很有用,但 dll(就像您的代码一样)仅限于可访问的 API。
但是……反射并没有这种限制,只要有足够的访问权限,您几乎可以做任何事情。为了提高性能,您可能不希望直接使用反射,但如果您有足够的权限直接在内存中创建 IL ( DynamicMethod
),那么您可以告诉它(基于每个动态方法)Type
代码是有关联。例如,如果我创建一个DynamicMethod
传递typeof(Foo)
作为owner
参数,那么该动态方法可以完全访问Foo
. 对于信息,Delegate.CreateDelegate
提供对其他受保护数据的类似访问。由于DataContractSerializer
不担心预生成,因此可以使用此访问权限。
它XMLSerializer
通过使用反射以相同的方式执行此操作。
不同的是,XMLSerializer
不会触及私人领域,而是DataContractSerializer
意志。
请参阅有关反射和更改私有字段的SO 问题和答案。