【问题标题】:Android app and serialization/deserialization efficiency?Android应用和序列化/反序列化效率?
【发布时间】:2016-04-03 20:17:08
【问题描述】:

最初的搜索并没有呈现出我预期的结果,而且 Google 也没有太大帮助。所以这里...

我正在开发一个将对象序列化为文件的应用程序。由于应用程序的性质,实际上没有必要一次序列化多个对象(因为通常一次创建一个对象)。

但是,反序列化是我的问题所在。

我想做的是能够基于 ID 反序列化一个特定对象。

换句话说,假设我有一个包含以下数据的序列化对象文件:

1,蒙哥马利伯恩斯,M,100 2,荷马辛普森,M,38 3、韦伦·史密瑟斯,男,44 岁 4、小丑克鲁斯蒂,男,60 岁 5,玛吉辛普森,F,38 ...等等...

假设我只想获取第二个对象(例如,ID 是 2)。

根据我所做的阅读和研究,没有办法以这种方式获取 特定 对象。如果我理解正确,我将不得不将我的整个序列化对象文件(我们称之为 data.ser)读入内存(例如,反序列化对象的数组或列表),然后对其进行迭代,直到找到我正在寻找的内容为了。对吗?

我这样做没有问题,只是看起来效率非常低。

虽然我预计我的应用程序的用户不会拥有数百或数千个对象,所以这一切都可能无关紧要,我只是想知道我是否正确理解了这一点。主要用于个人使用和Android自学。

我不反对使用嵌入式数据库。我现在想避免它,只是为了减小应用程序的大小。

那么我理解正确吗?除了我上面说明的之外,我实际上还没有看到检索特定对象的方法。我的理解是,在 Java 中唯一的方法是遍历对象。

【问题讨论】:

  • 使用 GSON 会有所帮助
  • 文件必须在内存中,至少最初是这样,任何程序才能知道文件的内容。我敢肯定有一些库是用来查询文件的,甚至不应该过多地参与其中。

标签: java android serialization deserialization


【解决方案1】:

我正在开发一个将对象序列化为文件的应用程序。

根据您的其余问题,我将假设您指的是 Java 序列化。 AFAICT,已经过时了十多年,我绝不会建议任何人花费超过 10 秒的时间将其视为存储选项。但是,当然欢迎您使用它。

根据我所做的阅读和研究,无法以这种方式获取特定对象。

那是因为您决定将它们全部放在一个文件中。序列化的单位是顶层对象。

当然欢迎您将它们分别存储在自己的文件中,并使用一个文件名,以便您在需要时识别要反序列化的正确文件。

或者,欢迎您维护一个单独序列化的“索引”(例如,HashMap),您可以在其中维护足够的信息来识别代表对象本身的文件。这个想法是你保持“索引”足够小,维护它相对便宜。

(例如,ID是2)

所以,让thingy-2.ser 包含 ID 为 2 的序列化对象,这样您就可以反序列化该对象。

我这样做没有问题,只是看起来效率非常低。

你真正的低效在于写作,而不是阅读。如果您更改一个对象中的一个字节,则必须写出整个集合。相比之下,阅读成本较低。

【讨论】:

  • 我需要在这里给你一个大拇指!这是很好的信息。你推荐什么来代替序列化?你说得对,我正在使用 Java,而且我正在编写一个 Android 应用程序,所以我正在寻找一种存储信息的方法,以便高效地写入和读取。
  • @MJR:嗯,我对你的数据模型了解得不够多,无法给你一个可靠的建议。 SQLite(有或没有 ORM 层)是一个典型的选择,因为您可以获得一个完整的 SQL 数据库来随机访问您的数据。有本地(例如 Realm)、托管(例如 Parse)或两者(例如 Couchbase/Couchbase Mobile)的替代数据库。如果您想要序列化的感觉,JSON 或可能的 FlatBuffers,因为它们至少是跨语言的(与 Java 序列化相反)。
  • 我的数据模型本质上是三个字段。一个是充当 ID 的 UUID,以及另外两个字符串字段。我曾考虑使用 Derby 或其他“嵌入式”数据库。在这一点上,我认为大小增加可以忽略不计,考虑到应用程序的整体大小无论如何都会相对较小。我得去看看Realm。感谢你的帮助!我如何奖励你积分??
  • @MJR:“我考虑过使用 Derby,或者其他“嵌入式”数据库”——我不知道您为什么要使用 Derby 而不是 SQLite。 SQLite 是 Android 的一部分; Derby 不是(尽管它可能可以在 Android 上运行)。与 Derby 相比,SQLite 也将更快一些,并且更“标准”(即更多关于使用它的文章)。如果您愿意,当然欢迎您使用它,但它绝对是非传统的。 “我怎么给你积分?” - 这是接受答案的一部分。 :-)
  • 有趣。再次感谢。我不知道 SQLite 是“内置的”。我一定会调查的。在这个开发阶段,根据需要添加/修改我的设计模式以合并 SQLite 应该不难。并认为您的答案已被接受!你帮了大忙!
猜你喜欢
  • 2013-09-19
  • 1970-01-01
  • 2010-12-06
  • 2011-08-26
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多