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

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

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

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

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

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

Обновление:

(Для того, чтобы "не размыть" мой вопрос: p)

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

    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:

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

Ответы [ 6 ]

4 голосов
/ 10 декабря 2008

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

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

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

3 голосов
/ 10 декабря 2008

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

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

3 голосов
/ 10 декабря 2008

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

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

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

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

3 голосов
/ 10 декабря 2008

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

2 голосов
/ 10 декабря 2008

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

2 голосов
/ 10 декабря 2008

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

...