Как уже упоминалось в последующей комментарий к первоначальному вопросу, .NET выделяет узлы при создании XmlSerializers и кэширует сгенерированную сборку, если она создается с помощью одного из этих двух конструкторов:
XmlSerializer(Type)
XmlSerializer(Type, String)
Агрегаты сгенерированные использование других конструкторов не кэшируется, поэтому .NET должен генерировать новые сборки каждый раз.
Почему? Этот ответ, вероятно, не очень приятен, но, глядя на него в Reflector, вы можете видеть, что ключ, используемый для хранения и доступа к сгенерированным сборкам XmlSerializer
(TempAssemblyCacheKey
), представляет собой простой составной ключ, построенный из сериализуемого типа и (необязательно) его Пространство имен.
Таким образом, нет механизма, чтобы определить, имеет ли кешированный XmlSerializer
для SomeType
специальный номер XmlRootAttribute
или по умолчанию.
Трудно представить себе техническую причину, по которой ключ не может вместить больше элементов, поэтому это, вероятно, просто функция, которую никто не успел реализовать (тем более, что она включала бы изменение в противном случае стабильных классов).
Вы, возможно, видели это, но в случае, если у вас нет, the XmlSerializer
class documentation обсуждает обходной путь:
Если вы используете какие-либо из других конструкторов несколько версий же сборок не генерируются и никогда , что приводит к выходу из памяти утечки и низкой производительности. Самое простое решение состоит в том, чтобы использовать один из ранее упомянутых двух конструкторов. В противном случае вы должны кэшировать сборку в Hashtable,
, как показано в , следующем примере.
(я опустил пример здесь)
Хорошо, похоже, проблема та t сборка сериализации создается для каждого экземпляра сериализатора, если вы укажете для сериализатора ничего, кроме параметра типа! Вот почему, я полагаю, я вижу такое ужасное выступление. Кто-нибудь знает причину, по которой XmlSerializer по умолчанию будет делать это? Я не понимаю, почему просто указание имени корневого узла означает, что кеш нельзя использовать? – Dougc