6

リフレクションを使用して XMLSerializer がどのように機能し、XML のシリアル化または逆シリアル化に使用する必要があるパブリック読み取り/書き込みフィールドまたはプロパティを把握するかを理解しています。ただし、XMLSerializer では、フィールドが public で読み取り/書き込み可能である必要があります。

ただし、DataContractSerializer は、クラス内の完全にプライベートなフィールドに対して読み取りまたは書き込みを行うことができます。したがって、DataContractSerializer にクラスへの追加のアクセス権を明示的に付与しなくても、これがどのように可能になるのか疑問に思っています。

4

2 に答える 2

7

リフレクションには多くの機能があります。XmlSerializerには、「sgen.exe」を介して、シリアル化コードをバイナリ (dll) に事前にビルドする機能があります。これは、動的コードを許可しない一部のシナリオで役立ちますが、dll (コードと同様) はアクセス可能な API に限定されます。

ただし... リフレクションこれほど制限されているわけではなく、十分なアクセス権があればほとんど何でもできます。パフォーマンスのために、おそらくリフレクションを直接使用することはあまり望ましくありませんが、メモリ内に直接 IL を作成するのに十分な権限がある場合 ( DynamicMethod)、(動的メソッドごとに) コードがどのTypeコードであるかを伝えることができます。と関連した。たとえば、引数としてDynamicMethodpassを作成すると、その動的メソッドは のすべてのメンバー (フィールドを含む) に完全にアクセスできます。詳細については、保護されていないデータへの同様のアクセスを提供します。事前生成を気にしないので、このアクセスを使用できます。typeof(Foo)ownerFooDelegate.CreateDelegateDataContractSerializer

于 2010-04-04T08:18:19.423 に答える
2

XMLSerializerリフレクションを使用して、 と同じ方法でそれを行います。

違いは、XMLSerializerプライベート フィールドではなく、DataContractSerializer意志に触れることです。

プライベート フィールドのリフレクションと変更に関するこのSO の質問と回答を参照してください。

于 2010-04-03T20:10:08.050 に答える