Лучший способ хранить экземпляры классов в файле / базе данных

Каков наилучший способ хранения экземпляров класса в файл / базу данных?

У нас есть базовый класс с именем Command и множество производных классов. Пользователи создают экземпляры этих классов, добавляя команды в графический дизайнер, где они могут их настраивать. (Установить свойства).

Затем нам нужен способ сохранить эти «команды» в файле без потери какой-либо информации.

Одной из идей было использование db4o, но лицензия GPL неприемлема для этого проекта.

Есть предложения или примеры кода?

Обновить:

(Для того, чтобы "де-расплывчато" мой вопрос: с)

Сгенерированный код может выглядеть примерно так:

    command[i++] = new DelayInSecondsCommand(2);
    command[i++] = new DaliRequestCommand(1, false, 254);
    command[i++] = new DaliRequestCommand(2, false, 254);
    command[i++] = new DaliRequestCommand(3, false, 254);
    command[i++] = new WaitInSecondsCommand(2);             
    command[i++] = new DaliRequestCommand(1, false, 0);
    command[i++] = new DaliRequestCommand(2, false, 0);
    command[i++] = new DaliRequestCommand(3, false, 0);
    command[i++] = new JumpCommand(0);

Но потом с множеством разных команд.

Я знаю, что это возможно с сериализацией .NET, хотя я никогда не использовал ее раньше, но мне было интересно, есть ли лучшие альтернативы, как я сказал, что db4o кажется хорошим, но лицензия не подходит для проекта.

Обновление 2:

Спасибо за ответы. Я, вероятно, сейчас пойду с решением для сериализации, но я рассмотрю и другие варианты. Данные FYI хранятся в базе данных SQL Compact.

6 ОТВЕТОВ
РЕШЕНИЕ

Сериализация делает свое дело! Сериализация - это не что иное, как преобразование объекта или связанного графа объектов в поток байтов (чтобы сохранить текущее состояние объекта). Это может быть двоичный поток, XML или любой другой. Вам не нужно делать это преобразование самостоятельно, так как .Net имеет отличную поддержку для сериализации. После сериализации объекта вы можете сохранять эти данные в файле или базе данных. Аналогично, поток байтов, представляющих сериализованный объект, может быть десериализован в объект, который будет иметь то же состояние, что и исходный.

Кстати, когда у вас есть сериализованный поток байтов, вы можете применить к нему еще несколько функций, например сжатие или шифрование.

3
14.01.2014 11:22:57

Довольно размытый вопрос, почему бы вам просто не использовать встроенные возможности сериализации .NET (например, XmlSerializer).

2
10.12.2008 11:26:39

Есть http://www.neodatis.org . Это LGPL, но время, которое я использовал, было только реализацией для Java. Сейчас есть «бета» релиз для C #, но я не тестировал.

2
11.07.2009 14:09:06

db40 также предоставляет коммерческую лицензию, но недавно она была куплена компанией Versant, так что, возможно, вы захотите посмотреть на это. Этот тип базы данных известен как объектно-ориентированная база данных и является способом создания постоянных экземпляров классов, который сильно отличается от реляционных баз данных, которые работают с использованием таблиц.

Это (wikpedia.org) хорошо читается в объектно-ориентированных базах данных, и это (также википедия) представляет собой список некоторых доступных опций.

По моему мнению, объектные базы данных намного лучше и мощнее, чем реляционные, и я буду использовать реляционные базы данных, такие как mysql, только в том случае, если это действительно необходимо (не очень часто).

Я бы рекомендовал вам посмотреть эти видео и скачать пробную версию.

2
10.12.2008 11:45:32
Эй, хотя я уже знал это, это хороший ответ. Я думаю, что LINQ2SQL и Entity Framework обеспечивают хорошее промежуточное звено. Я посмотрю на новую лицензию db4o, хотя, спасибо. (Использовал его в прошлом, когда лицензии не были проблемой)
TimothyP 10.12.2008 12:31:13

Сериализация - отличный способ хранения данных этого типа. См. Http://blog.paranoidferret.com/index.php/2008/06/20/csharp-tutorial-xml-serialization/

2
10.12.2008 11:59:43

Вы пытаетесь сохранить данные в таблицах? или как данные blob / clob? Поскольку вы упоминаете файлы, я предполагаю последнее: любой из стандартных сериализаторов .NET должен быть в порядке - все они поддерживают наследование и т. Д., Я бы посоветовал DataContractSerializer, поскольку это объединяет поддержку на уровне поля (например BinaryFormatter) и независимость сборки из XmlSerializer.

Вы также можете рассмотреть более эзотерические вещи, такие как protobuf-net .

Итак: что нужно сделать, чтобы не работать под стандартными сериализаторами?

4
10.12.2008 12:03:28
Ах, действительно, Google Protocol Buffer, забыл об этом, спасибо!
TimothyP 10.12.2008 12:34:06