将类实例存储到文件/数据库的最佳方法

时间:2008-12-10 11:19:08

标签: c# .net serialization persistence object-oriented-database

将类的实例存储到文件/数据库的最佳方法是什么?

我们有一个名为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 个答案:

答案 0 :(得分:4)

您是否尝试将数据保存在表格中?还是blob / clob数据?既然你提到文件,我假设后者:任何标准的.NET序列化程序都应该没问题 - 它们都支持继承等。我考虑使用DataContractSerializer,因为它结合了字段级支持(如{{{ 1}}),以及BinaryFormatter的汇编独立性。

您还可以考虑更多深奥的内容,例如protobuf-net

那么:你需要做什么才能在标准序列化器下工作?

答案 1 :(得分:3)

http://www.neodatis.org。它的LGPL,但我在那里使用的时间只有Java的实现。现在,C#有一个“beta”版本,但我没有测试过。

答案 2 :(得分:3)

db40还提供商业许可证,但它最近被versant买了,所以也许你可能想看一下。这种数据库称为面向对象的数据库,是一种创建类的持久实例的方法,这与使用表的关系数据库非常不同。

This(wikpedia.org)是关于对象定向数据库的良好读物,this(也是维基百科)是一些可用选项的列表。

在我看来,对象数据库要好得多。比关系更强大,我只会使用像mysql这样的关系数据库,如果我真的需要(不经常)。

我建议您观看these videos并下载试用版。

答案 3 :(得分:3)

序列化可以解决问题!序列化只不过是将对象或连接的对象图转换为字节流(以便持久保存对象的当前状态)。这可以是二进制流,XML或其他。您不必自己进行此转换,因为.Net非常支持序列化。序列化对象后,可以将此数据存储到文件或数据库中。同样,表示序列化对象的字节流可以反序列化为一个与原始状态具有相同状态的对象。

顺便说一句:一旦你有一个序列化的字节流,你可以在它上面应用更多的函数,例如:压缩或加密。

答案 4 :(得分:2)

非常模糊的问题,为什么不使用.NET的内置序列化功能(例如XmlSerializer)。

答案 5 :(得分:2)