XmlSerializerContract.getSerializer () против нового XmlSerializer () - PullRequest
0 голосов
/ 19 марта 2012

Недавно я столкнулся с некоторым кодом, который последовательно использует Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract.getSerializer(typeof(X)) для создания нового сериализатора, где X - это тип десериализуемого объекта. При поиске документации в большинстве документов использовался new XmlSerializer(typeof(X)), и я едва мог найти документацию по XmlSerializerContract (и единственная официальная документация, которую я нашел, относилась к Outlook).

Каковы преимущества использования Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract.getSerializer() против new XmlSerializer()? При каких сценариях я бы хотел использовать каждый из них?

1 Ответ

2 голосов
/ 19 марта 2012

Для оптимизации производительности XmlSerializerXmlSerializerFactory) генерируют временную сборку, содержащую сериализатор для определенных типов.Тип, который вы упомянули (Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract), взят из этих сгенерированных сборок (см. http://treyhutcheson.wordpress.com/2007/02/20/dynamic-interface-implementations/)), поэтому вполне естественно, что вы не нашли никакой документации для этого.

Честно говоря, чтобымне кажется, что это какое-то хакерское решение, возможно, для обхода проблем утечки памяти связанных с XmlSerializer - если не используются конкретные конструкторы, XmlSerializer будет продолжать генерировать больше динамических сборок и, таким образом, увеличивать объем занимаемой памяти.1010 * MSDN на том же:

Динамически генерируемые сборки

Чтобы повысить производительность, инфраструктура сериализации XML динамически генерирует сборки для сериализации и десериализации указанных типов. Инфраструктура находит иповторно использует эти сборки. Это происходит только при использовании следующих конструкторов:

XmlSerializer.XmlSerializer (Type)

XmlSerializer.XmlSerializer (Type, String)

Если вы используете какой-либоиз других конструкторов, несколько версий тОдна и та же сборка генерируется и никогда не выгружается, что приводит к утечке памяти и снижению производительности.Самое простое решение - использовать один из двух упомянутых ранее конструкторов.В противном случае вы должны кэшировать сборки в Hashtable, как показано в следующем примере.

Я бы посоветовал выяснить фактическую причину использования недокументированного кода из сгенерированной сборки от заинтересованных разработчиков, нонезависимо от того, готовитесь ли вы отойти от одного и того же, используя XmlSerializer / XmlSerializerFactory - вы всегда можете использовать собственное решение для кэширования, если это необходимо (если вы не используете эти два конкретных конструктора).Не забудьте тщательно проверить свой код.

...