Сериализация иерархических свойств компонента (ZedGraph)
От: uni Россия  
Дата: 27.06.13 00:06
Оценка:
Доброго. Нужно сохранять свойства компонента в XML, свойства очень разнообразные (много и есть иерархия). Нужен совет, где почитать про сериализацию чего-то шибко сложного.
Вот исходники компонента: ZedGraph, ZedGraph Wiki. Это компонент для построения графиков в 2D.
Желательно, конечно, такой метод, чтобы можно было сохранять только отличия от значений по умолчанию, ибо xml слишком здоровый получится. Мне бы только идеологию понять как это делать, чтобы я потом на все эти свойства по шаблону распространил.
Re: Сериализация иерархических свойств компонента (ZedGraph)
От: Sinatr Германия  
Дата: 27.06.13 07:01
Оценка:
Здравствуйте, uni, Вы писали:

uni>сохранять свойства компонента в XML

uni>чтобы можно было сохранять только отличия от значений по умолчанию

Как правило разработчики компонента должны предусмотреть сериализацию (Serialize/Deserialize). Если в компонент загружаются данные, то скорее всего можно их получить и сохранять/загружать самому. В остальных случаях можно пройтись по свойствам используя рефлексию, проверять DefaultValueAttribute, записывать то, что отличается. Десериализация выглядит так: загрузить xml в словарь, пройтись по свойствам рефлексией еще раз, для каждого свойства (по имени) искать в словаре, если найдено — установить значение, иначе не трогать (значение по умолчанию). Иерархия делается элементарно — словарь в словаре.

Но можете наступить на грабли, если компонент будет обновляться и значения по-умолчанию будут (в теории) изменятся. Т.к. они не сохраняются, то в xml из старой версии компонента их не будет, а значит после установки новой версии используя xml из старой они все изменятся на новые по-умолчанию.
---
ПроГLамеры объединяйтесь..
Re: Сериализация иерархических свойств компонента (ZedGraph)
От: koodeer  
Дата: 27.06.13 21:04
Оценка:
Здравствуйте, uni, Вы писали:

uni>Доброго. Нужно сохранять свойства компонента в XML, свойства очень разнообразные (много и есть иерархия).


uni>Желательно, конечно, такой метод, чтобы можно было сохранять только отличия от значений по умолчанию


А эти данные как-нибудь можно представить в табличном виде? Если их загнать в DataSet/DataTable, то дальше всё просто: метод WriteXml принимает параметр XmlWriteMode.DiffGram — будут записаны только изменения.
Re[2]: Сериализация иерархических свойств компонента (ZedGraph)
От: uni Россия  
Дата: 28.06.13 01:39
Оценка:
Здравствуйте, koodeer, Вы писали:

K>Здравствуйте, uni, Вы писали:


uni>>Доброго. Нужно сохранять свойства компонента в XML, свойства очень разнообразные (много и есть иерархия).


uni>>Желательно, конечно, такой метод, чтобы можно было сохранять только отличия от значений по умолчанию


K>А эти данные как-нибудь можно представить в табличном виде? Если их загнать в DataSet/DataTable, то дальше всё просто: метод WriteXml принимает параметр XmlWriteMode.DiffGram — будут записаны только изменения.


В табличном виде это будет древовидная структура с элементами совершенно разного типа. Мне не нужно коллекции с данными графиков сохранять, цель — сохранить интерфейс. Дело в том, что я пишу свой компонент на его основе для математической программы SMath Studio и там нужно сохранить в xml данные о настройках компонента пользователем. Этот компонент очень навороченный, параметров за сотню, они вложенные, имеют разные типы (перечисление, шрифты, цвета и т.д.). Я хочу сделать два варианта настройки: 1) через скрипт (IronPython), 2) традиционное сохранение в XML. Не имеет смысла сохранять все 150 параметров, от этого только файл разбухнет, а толку — ноль. Если бы параметров было не так много, то я мог бы и вручную это делать, как уже сделал для другого, но гораздо простого компонента отображения графиков. Только уж это слишком муторно вручную это поддерживать, листинг слишком здоровый получился. Это плохой метод. Я думал, может кто занимался такого рода сериализацией или видел исходник с примером и мог бы показать.

Вот тут я для другого компонента делаю сохранение интерфейса вручную (FromXml(), ToXML()): XYPlot.cs.
Повторять подвиг больше нет желания. Сам компонент — это переделанный из книжки: C# Application Series — Xu J. — Practical C# Charts and Graphics [2007, PDF, ENG] (есть на рутрекере). Вот для него я смог осилить ручную сериализацию, но понял, что это какой-то тупиковый путь.
Re[3]: Сериализация иерархических свойств компонента (ZedGraph)
От: koodeer  
Дата: 28.06.13 03:24
Оценка: +1
Здравствуйте, uni.

Как я понял, нужно сериализовать свойства самых разных классов, при этом не сохраняя те свойства, которые имеют значения по умолчанию.
XmlSerializer умеет это. Достаточно на свойства навесить атрибут DefaulValue с желаемым значением. Более того, этот атрибут можно добавить к любому свойству любого класса динамически: пример.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.