2

当我第一次开始使用 Java PreferencesAPI 时,API 中一个明显的遗漏是一种putObject()方法。我一直想知道他们为什么不包括它。

因此,我进行了一些谷歌搜索,发现 IBM 的这篇文章向您展示了如何做到这一点: http: //www.ibm.com/developerworks/library/j-prefapi/

他们使用的方法对我来说似乎有点骇人听闻,因为您必须将它们分解Objectbyte矩阵,存储它们,然后再重新组合它们。

我的问题是,有人试过这种方法吗?你能证明这是存储/检索对象的好方法吗?

我也很好奇为什么 Java 开发人员没有putObject()使用 API。有没有人有宝贵的见解?

4

2 回答 2

5

我也很好奇为什么 Java 开发人员将 putObject() 排除在 API 之外。有没有人有宝贵的见解?

来自:http ://docs.oracle.com/javase/7/docs/technotes/guides/preferences/designfaq.html

为什么这个 API 不包含读写任意可序列化对象的方法?

序列化的对象有些脆弱:如果读取此类属性的程序版本与编写它的版本不同,则该对象可能无法正确反序列化(或根本不反序列化)。使用此 API 存储序列化对象并非不可能,但我们不鼓励这样做,也没有提供方便的方法。

于 2013-11-06T12:53:26.867 回答
4

本文描述了一种可靠的方法。我看到有几件事我可能会做不同的事情(比如我会存储件数的数量以及件数本身,以便在检索它们时可以轻松解决问题)。

不过,您对序列化的评论是错误的……您要存储的对象必须是可序列化的……这就是文档使用的 ObjectOutputStream 的工作方式。

所以,是的,它看起来像一个可靠的机制,你需要有 Serializable 对象,我想 putObject 和 getObject 不是 API 的一部分的原因有两个:

  1. 它不是 Windows 注册表本机方式的一部分
  2. 它冒着人们将大量数据放入注册表的风险。

在注册表中存储序列化对象让我感到有些担忧,因为它们可能太大了。我只会在无法从构造函数重构 Object 并且序列化版本相对较小的情况下使用它。

于 2013-11-06T12:49:09.400 回答