在Android中使用Serializable是不是很糟糕?

Alp*_*rae 53 android serializable parcelable

我一直在阅读很多文章和文章,颂扬Parcelable在Serializable上的速度.我一直在使用两种方法来通过Intents在Activities之间传递数据,并且在两者之间切换时还没有注意到任何速度差异.我必须传输的典型数据量是5到15个嵌套对象,每个对象有2到5个字段.

由于我有大约30个必须可转移的类,因此实现Parcelable需要大量的样板代码来增加维护时间.我目前的要求之一是编译的代码应该尽可能小; 我希望通过使用Serializable over Parcelable可以节省一些空间.

我应该使用Parcelable还是没有理由在Serializable上使用它来处理这么少量的数据?还是有另一个原因我不应该使用Serializable?

hac*_*bod 66

对于内存使用,Parcelable远远优于Serializable.我强烈建议不要使用Serializable.

您不能将Parcelable用于将存储在磁盘上的数据(因为它在事情发生变化时对数据一致性没有很好的保证),但是Serializable足够慢,我强烈建议不要在那里使用它.你最好自己编写数据.

此外,Serializable的一个性能问题是它结束了旋转大量临时对象,导致应用程序中的大量GC活动.这太令人发指了.:}

  • 您是否有任何证据支持您的声明"对于内存使用,Parcelable远远超过Serializable"?根据我的测试,它比Serializable慢得多.检查此测试项目:https://bitbucket.org/afrishman/androidserializationtest (5认同)

Cha*_*les 53

继续使用序列化.你会看到许多在线人员会告诉你序列化是非常缓慢和低效的.那是正确的.但是,作为一名计算机程序员,你永远不想做的一件事就是对性能作出绝对的评论.

问问自己序列化是否会减慢你的程序速度.你注意到它从活动到活动的时间吗?你注意到它何时保存/加载?如果没有,那很好.当你去大量的手动序列化代码时,你不会占用更小的空间,因此没有优势.那么,如果它比另一种慢100倍,如果慢100倍意味着10ms而不是0.1ms呢?你也不会看到,所以谁在乎呢?而且,为什么有人会投入大量精力为30个班级编写手动序列化,而不会在性能方面产生任何明显的差异?

  • 更好的是,根据我的观察,通常的Java序列化(如果做得好)比Parcelable快得多.请参阅下面的答案中的详细信息 (2认同)

afr*_*ish 16

每个人都盲目地说Parcelable比Serializable更好更快,但是没有人试图用任何证据支持他的陈述.我决定自己测试一下,结果非常有趣.

平均Android设备上的常规Java序列化(如果正确)比写入Parcelable快约3.6倍,读取快约1.6倍.

您可以在此处查看我的测试项目:https://bitbucket.org/afrishman/androidserializationtest

  • @damson这就是我称之为"序列化正确"的原因.在上面提到的每个人都提到的文章中,序列化没有充分发挥其潜力.这是不公平的比较.在我的基准测试中,我试图使其更公平,结果完全不同.问题在于每个人都"忘记"了writeObject()/ readObject()方法,这些方法允许快速使Java内置序列化闪烁,而不会破坏像Parcelable这样的平台特定事物. (3认同)
  • 我完全同意.实际上我觉得,既有用又有安静的等价物,但只是取决于你的应用场景.这篇文章将另一篇文章放在Serializable上http://nemanjakovacevic.net/blog/english/2015/03/24/yet-another-post-on-serializable-vs-parcelable/ (3认同)