2

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

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

感谢您的答复。我现在可能会使用序列化解决方案,但我也会研究其他选项。FYI 数据存储在 SQL Compact 数据库中。

4

6 回答 6

4

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

您还可以考虑更深奥的东西,例如protobuf-net

那么:您需要做什么才能在标准序列化程序下不起作用?

于 2008-12-10T12:03:28.543 回答
3

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

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

于 2008-12-10T11:52:07.927 回答
2

相当模糊的问题,为什么不直接使用.NET 的内置序列化可能性(例如XmlSerializer)。

于 2008-12-10T11:26:39.130 回答
2

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

于 2008-12-10T11:42:57.070 回答
2

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

这个(wikpedia.org)是面向对象数据库的好读物,这个(也是维基百科)是一些可用选项的列表。

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

我建议您观看这些视频并下载试用版。

于 2008-12-10T11:45:32.087 回答
2

序列化是存储此类数据的好方法。见http://blog.paranoidferret.com/index.php/2008/06/20/csharp-tutorial-xml-serialization/

于 2008-12-10T11:59:43.683 回答