Как DataContractSerializer пишет в частные поля?

Я понимаю, как XMLSerializer мог работать при помощи отражения для выяснения, какие общедоступные поля чтения-записи или свойства это должно использовать, чтобы сериализировать или десериализовать XML. Все же XMLSerializer требует, чтобы поля были общедоступны и чтение-запись.

Однако DataContractSerializer может читать или записать в или от абсолютно частных полей в классе. Таким образом, я задаюсь вопросом, как это даже возможно с явным предоставлением DataContractSerializer дополнительных прав доступа к моему классу (классам).

6
задан Eric Anastas 3 April 2010 в 20:06
поделиться

2 ответа

Reflection имеет множество функций. XmlSerializer имеет через sgen.exe возможность предварительно построить код сериализации в двоичный файл (dll). Это полезно в некоторых сценариях, которые не позволяют использовать динамический код, но библиотеки DLL (как и ваш код) ограничены доступным API.

Однако ... отражение не является таким ограниченным, и с достаточным доступом вы можете делать практически все, что угодно. Для повышения производительности вы, вероятно, не захотите часто использовать отражение напрямую , но если у вас достаточно прав для создания IL непосредственно в памяти ( DynamicMethod ), вы можете указать это ( на основе динамического метода), с которым Тип связан код. Например, если я создаю DynamicMethod , передавая typeof (Foo) в качестве аргумента owner , то этот динамический метод будет иметь полный доступ ко всем членам (включая поля) на Foo . Для информации: Delegate.CreateDelegate предоставляет аналогичный доступ к другим защищенным данным. Поскольку DataContractSerializer не заботится о предварительной генерации, он может использовать этот доступ.

7
ответ дан 10 December 2019 в 02:45
поделиться

Он делает это так же, как XMLSerializer , используя отражение.

Разница в том, что XMLSerializer не будет касаться закрытых полей, а DataContractSerializer будет.

См. этот SO вопрос и ответы об отражении и изменении частных полей.

2
ответ дан 10 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: