Настройка XAML-сериализации графов объектов - PullRequest
3 голосов
/ 21 декабря 2011

Мое приложение генерирует файлы XAML из объектов в памяти, используя встроенное решение .NET: System.XamlServices.Save(Stream, Object) Однако получаемый мной XAML сильно загрязнен.Все свойства всегда сериализуются. Есть ли способ сказать сериализатору XAML игнорировать свойства, которые содержат их значения по умолчанию? (У меня почти полный контроль над сериализуемыми классами.)

Expression Blend прекрасно решает эту проблему: если мы не изменим свойство, сгенерированный файл XAML вообще не будет его содержать.Полученный XAML не загроможден всеми возможными свойствами и их значениями по умолчанию и не похож на обычный автоматически сгенерированный беспорядок.Я тоже хотел бы иметь красивый XAML.

Ответы [ 2 ]

3 голосов
/ 12 июня 2012

Старый вопрос, но у меня тоже недавно была эта проблема, и похоже, что сериализатор Xaml уважает DefaultValueAttribute .

На самом деле я не проверял это ни в одной версии, кроме .net 4.5, но я помню, что читал об этом в статье за ​​2006 год (которую я не могу найти сейчас, к сожалению)

Два других атрибута для поиска более чистого xaml - это ContentAttribute это позволяет perticular свойству быть «по умолчанию», когда другие элементы указаны как прямые дочерние элементы для этого элемента, и ContentWrapperAttribute , который позволяет вам указать, какой тип использовать для переноса этих значений (для коллекций)

1 голос
/ 10 января 2012

Для этого достаточно одного объекта:

После того, как:

  • Создать новый объект со свойствами по умолчанию
  • Сериализуйте его в XAML
  • Загрузить его в XML DOM
  • Рекурсировать через каждый дочерний и дочерний узел
  • Сохраните каждый в словарь с ключом XPath узла, значением innerXML. Очевидно, что если у вас есть узлы с одинаковым путем, это не сработает, вам придется их квалифицировать. Но в таком случае вы, вероятно, все равно не захотите их обрезать.
  • Вам больше не нужен этот объект. Брось это, держи словарь рядом.

Для каждого объекта:

  • Сериализация этого объекта в XAML
  • Loadit в XML DOM
  • Выполняется через каждый дочерний и дочерний узел
  • Посмотрите каждый XPath в словаре.
  • Если innerXML такой же, запишите это в списке узлов, которых следует опасаться.
  • Когда закончите повторение, покажите этим узлам, почему они боятся - УДАЛИТЕ их!
  • В DOM должен быть красивый XAML.

У меня был такой же XPath в словаре, чтобы лучше работать вложенные объекты. Однако от меня зависит, какие у вас объекты и как они вложены, чтобы я мог говорить об этом. удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...