初步搜索并没有提供我预期的结果,谷歌也没有多大帮助。所以这里......
我正在开发一个应用程序,我将对象序列化为文件。由于应用程序的原因,一次只能序列化多个对象(因为通常一次只能创建一个对象)。
然而,反序列化是我有问题的地方。
我想要做的是能够根据ID反序列化特定的对象。
换句话说,让我说我有一个带有以下数据的序列化对象文件:
1,蒙哥马利伯恩斯,男,100岁 2,荷马辛普森,男,38岁 3,Waylon Smithers,男,44岁 4,Krusty the Clown,男,60岁 5,Marge Simpson,女,38岁 ...等等...
让我们说我只想得到第二个对象(例如,为了这个,ID是2)。
根据我已完成的阅读和研究,无法以这种方式获得特定的对象。如果我理解正确,我将不得不将我的整个序列化目标文件(让它称之为data.ser)读入内存(例如,一个数组或反序列化对象列表),然后迭代它直到我找到了什么我正在寻找。这是对的吗?
我这样做没有问题,看起来效率非常低。
虽然我没有预料到我的应用程序的用户有数百或数千个对象,所以这一切都可能无关紧要,我只是想知道我是否正确理解这一点。它主要用于Android的个人使用和自学。
我不反对使用嵌入式数据库。我现在想避开它,只是为了保持应用程序的大小。
我正确理解这一点吗?除了我上面说明的内容之外,我还没有真正看到过检索特定对象的方法。我的理解是,在Java中使用 的方法是迭代对象。
答案 0 :(得分:1)
我正在开发一个应用程序,我将对象序列化为文件。
我将从您的其余问题中假设您指的是Java序列化。 AFAICT,已经淘汰了十多年,我永远不会建议任何人花费超过10秒钟将其视为存储选项。但是,我们当然欢迎您使用它。
根据我已经完成的阅读和研究,无法以这种方式获得特定对象。
那是因为你决定将它们全部放在一个文件中。序列化的单位是顶级对象。
当然欢迎您将它们存储在各自的文件中,并使用文件名识别正确的文件,以便在需要时进行反序列化。
或者,欢迎您保持"索引" (例如,HashMap
)单独序列化,您可以在其中保留足够的信息来标识表示对象本身的文件。这个想法是你保持"索引"小到足以维持它相对便宜。
(例如,ID为2)
因此,让thingy-2.ser
包含ID为2的序列化对象,这样就可以反序列化该对象。
我这样做没有问题,看起来效率非常低。
你真正的低效率是写作,而不是阅读。如果更改一个对象中的一个字节,则必须写出整个集合。相比之下,阅读便宜。