通过序列化存储对象的最有效方法

时间:2012-01-05 12:48:04

标签: c# serialization

这更像是一个设计问题,我正在寻找一个好的方法:

我有一个包含几个属性的对象(一些Integers和一个byte[] array)。

我正在使用BinaryFormatter序列化我的对象 - 我在任何给定时间都持有List<T>个所有对象。

  • 当应用程序启动时,我反序列化对象被反序列化的文件。
  • 当应用程序关闭时,我会序列化整个List<T>并将所有内容保存到文件中。

我的问题是:如果系统出现故障,我在List<T>中保留的对象显然会丢失,因为我只在应用程序正常关闭时序列化List<T>

我不是在考虑反序列化&amp; 序列化每次我想将一个对象插入我的列表,因为这将非常昂贵。

我想到的解决方案是保存一个带有BLOB列的本地数据库,对象将序列化到该列,但我不太确定这种方法。

任何想法都会受到赞赏!!

3 个答案:

答案 0 :(得分:1)

仅在应用程序启动时反序列化。

如果要确保在应用程序崩溃时没有丢失任何项目,则每次添加新项目时都需要序列化(或使用UnhandledException事件)。

如果没有,我会在添加新项目时使用后台线程序列化列表,并在退出应用程序时使用主线程序列化。

  

我想到的解决方案是保存一个带有BLOB列的本地数据库,对象将序列化到该列,但我不太确定这种方法。

我认为使用数据库没有任何好处。它实际上比将所有内容序列化为文件要慢。

答案 1 :(得分:0)

我会添加简单的ORM,让我们说Sqlite数据库,并避免标准的二进制序列化。我个人不喜欢它,因为在应用于之前序列化的对象的更改(如添加/删除属性,更改类型,函数参数或其序列)将导致deserialization失败。换句话说,它不是可扩展的, imo

答案 2 :(得分:0)

我的方法是binlogging:

  • 在应用程序运行时,如果从列表中删除对象 只需在文件中写出一个通知。如果添加对象 列表,只序列化这一个并再次写出来。 (一切 使用诸如change-00000000001.del之类的文件名的方式, change-00000000002.add等。)
  • 当应用程序关闭时,在最终序列化后删除所有change- * files
  • 在反序列化(旧状态)后启动时,检查change- *文件:如果它们存在,则发生崩溃,我们必须对其进行处理,然后执行新的序列化并删除更改文件