在Java中持久保存对象的轻量级方法

时间:2011-04-25 21:08:30

标签: java

我正在尝试设计一种在Java中存储持久数据的轻量级方法。我已经有了一种非常有效的方法将POJO序列化到DataOutputStreams(并返回),但我正在考虑一种确保在必要时对POJO中数据的更改进行序列化的好方法。

这是一个客户端应用程序,我试图尽可能低地保持最终可分发的大小,所以我不愿意使用任何可以引入重量级依赖的东西。现在我的可分发性几乎是10MB,我不希望它变得更大。

我考虑过DB4O,但它太重了 - 我需要一些轻松的东西。真的可能是我需要的设计模式,而不是图书馆。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

“最轻的权重”持久性选项几乎肯定会标记某些类Serializable并从某个固定位置读取/写入。你想要完成比这更复杂的事情吗?如果是这样,是时候捆绑hsqldb并使用ORM。

如果您的用户精通技术,或者您只是担心初始有效负载,那么有些库可以在运行时提取依赖关系,例如Grape

答案 1 :(得分:0)

如果你已经有一个以字节为单位的压缩数据输出格式(假设你有效地坚持到DataOutputStream,我认为你有这种格式),那么一种有效且通用的技术就是使用 run-length-encoding 在前一个字节数组输出和新字节数组输出之间的差异

注意事项:

  • 如果对象没有改变,字节数组的差异将是一个零数组,因此压缩非常小....
  • 首次序列化对象时,请将前一个输出视为全零,以便传达完整的数据集
  • 当对象具有可变大小的子结构时,你可能想要有点聪明....
  • 您也可以尝试压缩差异而不是RLE - 在某些情况下,如果您有一个包含大量更改的大对象图,可能会更有效率