Можно ли сериализовать динамический граф объектов в XML с конкретными пространствами имен XML (XMLNS)? - PullRequest
1 голос
/ 30 августа 2011

У меня есть причудливый сценарий, который благодаря нашему использованию .NET 4 и C # 4, похоже, оказался в мешке. Как выясняется, решение является более сложным и, возможно, не существует вне какого-то совершенно нестандартного решения.

В двух словах, мне нужно сериализовать динамический объект, который имеет набор фиксированных, обязательных свойств и произвольный набор дополнительных свойств. Корневой элемент должен включать настраиваемое пространство имен xml в атрибуте xmlns, и некоторым дочерним объектам может потребоваться использовать разные пространства имен xml. Нашим первым подходом было получение пользовательского класса из DynamicObject. Это позволило нам добавить XmlRootAttribute и указать пространство имен. За исключением сложности определения пользовательских пространств имен для динамических свойств, даже этот простой подход, похоже, не сработал. XmlSerializer, несмотря на то, что в качестве объекта для сериализации передается переменная dynamic, просто сериализует жестко закодированные свойства и игнорирует любые динамические аспекты объекта.

Мы уже некоторое время используем JsonFx 2.0 и решили попробовать. С некоторыми осторожными улучшениями нашего производного DynamicObject мы смогли заставить JsonFx 2.0 сериализовать весь необходимый контент, однако он отказывается сериализовать любые атрибуты xmlns.

Есть ли способ сериализации частично динамического объекта в xml и включения определенных пространств имен? Или это просто случай, когда нужно определить произвольно сложный граф объектов, выбрать граф, который соответствует конкретным потребностям, динамически полученным во время выполнения?

Кажется, что история сериализации XML для .NET 4 довольно слаба, когда дело доходит до сериализации динамических объектов.

1 Ответ

2 голосов
/ 30 августа 2011

XmlSerializer будет тыкать в вашу реализацию IXmlSerializable (если вы ее реализуете), прежде чем совершать магию отражения, необходимую для поиска [XmlElement] и его сумасшедших братьев и сестер.Просто внедрите IXmlSerializable вместе с DynamicObject, и вы сможете динамически как читать, так и писать любой XML, какой пожелаете.

...