我已经阅读了各种各样的建议,我很好奇“最先进的”是什么 -
我已经构建了一个传统的胖客户端(实际上是wpf)应用程序,它使用数据集(强类型)作为数据层 - 在应用程序的生命周期内在内存中使用,并且二进制序列化(和压缩)存储到一个文件。文件doenst需要与其他应用程序等具有任何兼容性,因此我可以自由选择我选择的任何存储机制。该应用程序还与webservices进行通信,它目前正在使用相同的强类型数据集。
该应用程序包括此文件中的所有类型的数据,从包含的图像,到相当长的数值列表(可能超过100k双打),到基本文本等。
所以,如果我想对这个应用程序进行现代化,我可能更喜欢在内存中使用各种通用的对象列表,然后可以将二进制序列化为文件。但有更好的方法吗?我知道使用该文件的数据库只允许我更新特定项目,而不是重新序列化整个事物,但是现在我不必处理弄清楚哪些项目已更改并需要更新等问题的头痛如果我坚持只是序列化所有内容,是否有更好或更标准化/开放的方式来实现这一点 - 比如协议缓冲区或bson。
如果需要,我会观察一些答案并在此添加任何说明。 TIA。
答案 0 :(得分:1)
问题标记为“sqlite”。好像你已经下定决心了吗? : - )
我总是试图规划未来,因此即使您愿意现在序列化整个文件而不需要知道哪个特定的数据已经更改,也会向您推荐SQLite。但有一天你可能会。
SQLite功能强大,占用空间小,具有非侵入式安装,System.Data.SQLite数据提供程序很好,并且支持使用.NET语言编写的UDF。它将为您的应用程序提供更精细的可寻址数据存储,以及另一组功能和智能,因此优于“被动”数据存储。
我没有使用SQLite来存储图像,因此我无法评论该要求。
答案 1 :(得分:0)
真正的问题应该是你为什么要考虑改变你的方法?如果您的数据集可能会变得比适合内存的数据集更舒适,那么您将被推向某种形式的数据库系统(有许多可行的)。如果它的大小相当静态,不需要与其他第三方应用程序互操作,并且适合您,则根本不需要更改它。
答案 2 :(得分:0)
如果您的数据“简单”:I.e。表格或层级(DAG)没有对象之间的复杂引用,那么你有很多选择。在这种情况下,讨论变得更“什么样的数据库”,即基于关系或文档。选择取决于数据的结构,数据量等。我会评估Sqlite,sql server compact,googles协议缓冲区,以及一些nosql实现,例如ravendb。
如果您的数据是一般对象图(不是非循环图),那么您就不那么幸运了。当您需要保留对象标识时,除了直接序列化整个图形之外的任何内容都很难实现。例如,出现更多困难。引用单例(BinaryFormatter实际上处理得很好)。一般的解决方案是使用BinaryFormatter写入文件,但是您将遇到3个新问题:性能,文件大小和文件格式兼容性。
如果您决定进行二进制序列化(只有在对象图需要它时才会出现这种情况),您可以使用ISerializable或更新的序列化属性实现自定义序列化,以详细控制序列化并提供更强大的格式。例如,BinaryFormatter的自动格式不能很好地处理自动属性。
如果您想要一种允许元数据等更灵活的格式,我建议您使用System.IO.Packaging类在PackagePart中创建包含数据的OPC存档文件。