2010-04-03 2 views
6

Я понимаю, как XMLSerializer может работать, используя отражение, чтобы выяснить, какие общедоступные поля для чтения/записи или свойства должны использоваться для сериализации или де-сериализации XML. Однако XMLSerializer требует, чтобы поля были общедоступными и считались/записывались.Как DataContractSerializer записывает личные поля?

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

ответ

7

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

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

2

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

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

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

Смежные вопросы