Сериализация для хранения документов

Я пишу настольное приложение, которое может открыться / редактирование / сохраняет документы.

Те документы описаны несколькими объектами различных типов, которые хранят ссылки друг на друга. Конечно, существует a Document класс это, которое служит корнем этой структуры данных.

Вопрос состоит в том, как сохранить эту модель документа в файл.

В чем я нуждаюсь:

  • Поддержка рекурсивных структур.
  • Это должно смочь открыть файлы, даже если бы они были произведены из немного отличающихся классов. Мои пользователи не хотят воссоздавать каждый документ после каждого выпуска просто, потому что я добавил поле где-нибудь.
  • Это должно иметь дело с классами, которые не известны во время компиляции (сменной поддержкой).

Что я усталый до сих пор:

  • XmlSerializer -> Приводит первые и последние критерии к сбою.
  • BinarySerializer -> Приводит вторые критерии к сбою.

  • DataContractSerializer: Подобный XmlSerializer, но с поддержкой циклических (рекурсивных) ссылок. Также это было разработано с (вперед/назад) совместимостью в памяти: Управление версиями Контракта Данных.[править]

  • NetDataContractSerializer: В то время как DataContractSerializer все еще требует для знания всех типов заранее (т.е. он не может работать очень хорошо с наследованием), NetDataContractSerializer хранит информацию типа в выводе. Кроме этого эти два, кажется, эквивалентны.[править]

  • protobuf-net: Не имел времени для экспериментирования с ним все же, но это кажется подобным в функции к DataContractSerializer, но использовании двоичного формата.[править]

Обработка неизвестных типов [редактирование]

Там кажусь два быть двумя основными положениями о том, что сделать, когда статический и динамический тип отличается (если у Вас есть поле текстового объекта, но a, позволяет, говорят, объект Человека в нем). В основном динамический тип должен так или иначе быть сохранен в файле.

  • Используйте различные XML-тэги для различных динамических типов. Но так как XML-тэг, который будет использоваться для конкретного класса, не мог бы быть равен имени класса, его единственное возможное, чтобы пойти этим путем, если deserializer знает все возможные типы заранее (так, чтобы он мог просканировать их для атрибутов).

  • Сохраните тип CLR (имя класса, имя сборки и версия) во время сериализации. Используйте эту информацию во время десериализации для инстанцирования правильного класса. Типы не должны быть известны до десериализации.

Второй более прост использовать, но получающийся файл будет зависимым CLR (и менее чувствительный для кодирования модификаций). Это, вероятно, почему XmlSerializer и DataContractSerializer выберите первый путь. NetDataContractSerializer не рекомендуется, потому что его использование второго approch (Так делает BinarySerializer между прочим).

Какие-либо идеи?

7
задан Stefan 7 February 2010 в 21:12
поделиться

4 ответа

Вышеуказанные советы должны быть выполнены, но я бы рекомендовал вам использовать:

public String translate(boolean trueOrFalse)
{
    return String.valueOf(trueOrFalse);
}

, потому что позже вы можете легко преобразовать это обратно:

public boolean translateBack(String translation)
{
    return Boolean.parseBoolean(translation);
}

, но последовательность перевода будет «true» из «false»:)

-121--4532794-

Переключатель аудиоустройств на панели задач использует «Software\Microsoft\Multimedia\Sound Mapper», «Playback» для установки индекса звукового устройства, полученного путем перечисления устройств. mciSendCommand из «winmm.dll» также используется

В этом исходном коде вы найдете разделы реестра, используемые для этого.

Если это не сработает, вы можете дать Process Monitor попробовать и контролировать все действия реестра окон при изменении устройства по умолчанию. При установке в ОС Vista панель управления смешивается с «HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\»

Для Vista см. http://www.vistaaudiochanger.com/

-121--3502541-

Неустранимый метод - DataContractSerializer. Существует конструктор, который принимает параметр bool preserityObjectReferences, который должен обрабатывать первые критерии.

4
ответ дан 7 December 2019 в 03:15
поделиться

Сериализатор контракта данных WCF, вероятно, ближе всего к вашим потребностям, хотя и не идеален.

Существует только ограниченная поддержка обратной совместимости (то есть, могут ли старые версии программы читать документы, созданные с помощью более новой версии). Поддерживаются новые поля (через IExtensibleDataObject), но не новые классы или новые значения перечисления.

3
ответ дан 7 December 2019 в 03:15
поделиться

XmlSerializer может работать для ваших первых критериев, однако вы должны предоставить рекурсию для таких объектов, как элемент управления TreeView.

BinaryFormatter может работать по всем 3 критериям. Если класс изменяется, вам может потребоваться создать инструмент преобразования для преобразования документов старого формата в новый формат. Или распознать старый формат, десериализовать его в старый, а затем сохранить в новом, сохраняя на некоторое время старый формат класса.

Это поможет покрыть допуск к версии , что, я думаю, вам нужно: MSDN - сериализация, допускающая версию

1
ответ дан 7 December 2019 в 03:15
поделиться

Я думаю, что XmlSerializer - ваш лучший выбор. Вы не сможете поддерживать все, что указано в вашем списке требований, не поработав с классами Document , но архитектура XmlSerializer дает вам точки расширяемости, которые должны позволить вам задействовать его механизм достаточно глубоко, чтобы сделать почти все.

Используя интерфейс IXmlSerializable - реализуя его в ваших классах, которые вы хотите сохранить - вы действительно сможете делать практически все, что угодно.

Интерфейс предоставляет в основном два метода - ReadXml и WriteXml.

public void WriteXml (XmlWriter writer)
{
    // do what you need to do to write out your XML for this object
}

public void ReadXml (XmlReader reader)
{
    // do what you need to do to read your object from XML
}

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

1
ответ дан 7 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: