序列化与数据库

Adi*_*rda 23 c# database serialization

我相信保存应用程序状态的最佳方法是传统的关系数据库,大多数时候,它的表结构几乎代表了我们系统的数据模型+元数据.

然而,我团队中的其他人认为,现在最好将整个对象图序列化为二进制或XML文件.
没必要说(但我仍然会说)第三次世界大战正在我们之间进行,我想听听你对这个问题的看法.

我个人讨厌序列化,因为:

  1. 保存的数据仅附加到您的开发平台(在我的情况下为C#).没有像Java或C++这样的其他平台可以使用这些数据.
  2. 保存整个对象图(包括所有继承链),而不仅仅是我们需要的数据.
  3. 尝试加载旧状态时,更改数据模型可能会导致严重的向后兼容性问题.
  4. 在应用程序之间共享部分数据是有问题的.

我想听听你对此的看法.

Dav*_*ope 16

您没有说明它是什么类型的数据 - 很大程度上取决于您的性能,同时性,安装,安全性和可用性/集中化要求.

  • 如果此数据非常大(例如,所讨论的对象的许多实例),则数据库可以通过其索引功能来帮助提高性能.否则它可能会伤害性能,或者难以区分.

  • 如果您的应用程序同时由多个用户运行,并且他们可能希望编写此数据,则数据库会有所帮助,因为您可以依赖事务来确保数据的完整性.使用基于文件的持久性,您必须自己处理.如果数据是单用户或单实例,则数据库很可能是过度杀伤.

  • 如果您的应用程序有自己的必须安装,那么使用数据库会给用户带来额外的负担,用户必须设置和维护(应用补丁等)数据库服务器.如果可以保证数据库可用并由其他人处理,则这不是问题.

  • 数据的安全要求是什么?如果数据是集中的,具有多个用户(同时或顺序),则可能需要管理数据的安全性和权限.在没有看到数据的情况下,很难说使用基于文件的持久性或数据库来管理是否更容易.

  • 如果数据仅限本地,则上述关于数据的许多问题都有针对基于文件的持久性的答案.如果您需要集中访问,答案通常指向数据库.

我的猜测是你可能不需要一个数据库,完全基于你主要从编程方便的角度而不是数据需求的角度来询问它.序列化,特别是在.NET中,是高度可定制的,可以轻松定制,只保留您需要的基本部分.对于这些数据的版本化也有众所周知的最佳实践,所以我不确定从这个角度来看数据库方面有什么优势.

关于跨平台问题:如果您不确定将来需要跨平台功能,请不要立即构建.在时机成熟(迁移等)时解决问题几乎肯定比现在限制你的开发更容易.通常,YAGNI.

关于在应用程序的各个部分之间共享数据:应该将其构建到应用程序本身,例如构建到访问数据的类中.不要将持久性机制重载为应用程序各部分之间的数据管道; 如果以这种方式重载它,则将持久状态转换为跨对象合约,而不是将其正确地视为对象私有状态的扩展.


Pet*_*ter 8

这取决于你想要序列化的当然.在某些情况下,序列化非常容易.

(我曾经在Java中编写了一种时间轴程序,你可以在其中绘制并调整对象的大小.如果你准备好了,你可以将它保存在文件中(比如myTimeline.til).在那个momenet上有数百个保存的对象,画布上的位置,它们的大小,颜色,它们的内在特征,它们的特殊效果......

你可以打开myTimeLine.til并进一步工作.

所有这些只询问了几行代码.(只是使所有类及其依赖项可序列化)并且我的编码时间不到5分钟,我自己也感到惊讶!(这是我第一次使用序列化)

在时间轴上工作,您还可以为不同版本"保存"以及非常容易备份和邮寄的"直播"文件.

我认为在我的特殊情况下使用数据库会有点傻.但这当然只适用于类似文档的结构,就像Word一样.)

我的观点首先是:当然有几种情况下数据库不是最佳解决方案. 开发人员不是因为他们感到无聊而发明了序列化.

  1. 如果您使用XMLserialization或SOAP,则不正确
  2. 不太相关了
  3. 只有你不小心,还有很多"最佳实践".
  4. 只有当您希望它有问题时,请参阅1

当然序列化除了实现速度之外还有其他一些重要的优点,比如在某些情况下根本不需要数据库!


Con*_*lls 3

请参阅此 Stackoverflow 帖子,了解有关 XML 的适用性与数据库管理系统的适用性的评论。它讨论的问题与您团队中辩论的主题非常相似。