2010-04-03 12 views
6

Ich verstehe, wie XMLSerializer funktionieren könnte, indem Sie mithilfe von Reflektion herausfinden, welche öffentlichen Lese-/Schreibfelder oder Eigenschaften verwendet werden sollten, um XML zu serialisieren oder zu deserialisieren. XMLSerializer erfordert jedoch, dass die Felder public und read/write sind.Wie schreibt DataContractSerializer in private Felder?

Der DataContractSerializer kann jedoch auch vollständig private Felder in einer Klasse lesen oder darauf schreiben. Ich frage mich, wie das überhaupt möglich ist, wenn ich DataContractSerializer explizit zusätzliche Zugriffsrechte für meine Klasse (n) gebe.

Antwort

7

Reflexion hat viele Eigenschaften. XmlSerializer hat über "sgen.exe" die Möglichkeit, den Serialisierungscode zu einer Binärdatei (DLL) vorzukonfigu- rieren. Dies ist in einigen Szenarien nützlich, in denen dynamischer Code nicht zulässig ist, dlls (genau wie Ihr Code) jedoch auf die zugreifbare API beschränkt sind.

Allerdings ... Reflexion ist nicht dies begrenzt, und mit genügend Zugriff können Sie so ziemlich alles tun. Für die Leistung möchten Sie wahrscheinlich nicht verwenden, Reflexion direkt eine Menge, aber wenn Sie genug Berechtigungen zum Erstellen von IL direkt im Speicher (DynamicMethod), dann können Sie sagen (auf einer pro-dynamische-Methode Basis) welche Type Der Code ist zugeordnet. Wenn ich zum Beispiel ein DynamicMethod als typeof(Foo) als owner Argument erstellen, dann hat diese dynamische Methode vollen Zugriff auf alle Mitglieder (einschließlich Felder) auf Foo. Für Informationen bietet Delegate.CreateDelegate ähnlichen Zugriff auf ansonsten geschützte Daten. Da DataContractSerializer sich nicht um die Vorgenerierung kümmert, kann es diesen Zugriff nutzen.

2

Es tut es die gleiche Weise die XMLSerializer tut, indem es Reflexion verwendet.

Der Unterschied ist, dass XMLSerializer private Felder nicht berühren wird, aber die DataContractSerializer wird.

Siehe this SO Fragen und Antworten über Reflexion und Veränderung von privaten Bereichen.