Я понимаю, как XMLSerializer мог работать при помощи отражения для выяснения, какие общедоступные поля чтения-записи или свойства это должно использовать, чтобы сериализировать или десериализовать XML. Все же XMLSerializer требует, чтобы поля были общедоступны и чтение-запись.
Однако DataContractSerializer может читать или записать в или от абсолютно частных полей в классе. Таким образом, я задаюсь вопросом, как это даже возможно с явным предоставлением DataContractSerializer дополнительных прав доступа к моему классу (классам).
Reflection имеет множество функций. XmlSerializer
имеет через sgen.exe возможность предварительно построить код сериализации в двоичный файл (dll). Это полезно в некоторых сценариях, которые не позволяют использовать динамический код, но библиотеки DLL (как и ваш код) ограничены доступным API.
Однако ... отражение не является таким ограниченным, и с достаточным доступом вы можете делать практически все, что угодно. Для повышения производительности вы, вероятно, не захотите часто использовать отражение напрямую , но если у вас достаточно прав для создания IL непосредственно в памяти ( DynamicMethod
), вы можете указать это ( на основе динамического метода), с которым Тип
связан код. Например, если я создаю DynamicMethod
, передавая typeof (Foo)
в качестве аргумента owner
, то этот динамический метод будет иметь полный доступ ко всем членам (включая поля) на Foo
. Для информации: Delegate.CreateDelegate
предоставляет аналогичный доступ к другим защищенным данным. Поскольку DataContractSerializer
не заботится о предварительной генерации, он может использовать этот доступ.
Он делает это так же, как XMLSerializer
, используя отражение.
Разница в том, что XMLSerializer
не будет касаться закрытых полей, а DataContractSerializer
будет.
См. этот SO вопрос и ответы об отражении и изменении частных полей.