6

我了解 XMLSerializer 如何通过使用反射来确定应该使用哪些公共读/写字段或属性来序列化或反序列化 XML。然而 XMLSerializer 要求这些字段是公共的并且是读/写的。

但是,DataContractSerializer 能够从类中的完全私有字段读取或写入。所以我想知道如果没有明确地赋予 DataContractSerializer 对我的类的额外访问权限,这怎么可能实现。

4

2 回答 2

7

反射有很多特点。XmlSerializer具有通过“sgen.exe”将序列化代码预构建为二进制 (dll) 的能力。这在某些不允许动态代码的情况下很有用,但 dll(就像您的代码一样)仅限于可访问的 API。

但是……反射并没有这种限制,只要有足够的访问权限,您几乎可以做任何事情。为了提高性能,您可能不希望直接使用反射,但如果您有足够的权限直接在内存中创建 IL ( DynamicMethod),那么您可以告诉它(基于每个动态方法)Type代码是有关联。例如,如果我创建一个DynamicMethod传递typeof(Foo)作为owner参数,那么该动态方法可以完全访问Foo. 对于信息,Delegate.CreateDelegate提供对其他受保护数据的类似访问。由于DataContractSerializer不担心预生成,因此可以使用此访问权限。

于 2010-04-04T08:18:19.423 回答
2

XMLSerializer通过使用反射以相同的方式执行此操作。

不同的是,XMLSerializer不会触及私人领域,而是DataContractSerializer意志。

请参阅有关反射和更改私有字段SO 问题和答案。

于 2010-04-03T20:10:08.050 回答