Java 序列化v/s可包裹Android

Java 序列化v/s可包裹Android,java,android,serialization,Java,Android,Serialization,正在处理缓存项目。希望在Android上使用文件系统。 我知道数据库也是一种选择,但我想尝试一下文件系统 在Android环境下使对象可序列化非常容易使用ObjectOutputStream和ObjectInputStream来序列化和反序列化Entire arraylist对象,这会自动发生 它还允许在两个活动之间传递对象。但是,在读取250个节点列表时,我的应用程序的加载时间增加了5倍 我知道parcelable也做传递部分,是Android的序列化方式。然而,任何人都知道如何将parcel

正在处理缓存项目。希望在Android上使用文件系统。 我知道数据库也是一种选择,但我想尝试一下文件系统

在Android环境下使对象可序列化非常容易使用ObjectOutputStream和ObjectInputStream来序列化和反序列化Entire arraylist对象,这会自动发生

它还允许在两个活动之间传递对象。但是,在读取250个节点列表时,我的应用程序的加载时间增加了5倍

我知道parcelable也做传递部分,是Android的序列化方式。然而,任何人都知道如何将parcelable和ObjectOutputStream一起使用,以便充分利用Android的序列化功能

另外,如果有人对如何加速readObject和writeObject的序列化有想法,请与我们分享。通过这样做,可以实现多大的差异,这样做是否明智

或者,在android系统中,数据库方式是缓存的唯一选项。不要忘记预缓存也可以通过db实现,但我们可以吗

  • 序列化很慢,因为它使用反射,反射非常慢。只有完全避免序列化,才能避免这种情况

  • ObjectOutputStream可以通过ByteArrayOutputStream生成字节数组。然后可以使用将字节数组保存到地块。这将仍然是缓慢的


  • 不要使用包裹。根据Android文档():

    Parcel不是通用的序列化机制。此类(以及用于将任意对象放置到地块中的相应Parcelable API)被设计为高性能。因此,不适合将任何地块数据放入永久性存储:地块中任何数据的底层实现中的更改都可能导致旧数据无法读取

    让一个对象实现可序列化的接口也有风险,因为这样你就会被绑定到该序列化格式。如果将来更改对象,则在读取在旧机制下序列化的对象时会遇到问题


    使用数据库可能是将内容缓存到磁盘的最佳选择。

    我不知道它是否有效,所以这只是一个想法: 尝试使用对象本身:

    使用
    包裹检索新实例。获取

    使用
    writeToParcel(包裹源)

    然后,如果要将值写入文件系统,请调用
    marshall()
    获取字节

    用ByteInputStream或类似的东西写下来


    再读一遍,打电话给unmarshall,打电话给ParcelableCreators

    如果你不喜欢sqlite,看看它的开源,对于android来说完全免费。您可以像save(Object o)一样保存对象,像get(MyOwnObject.class)一样检索对象,以获取所有存储的对象。您的意思是,如果将对象传递给服务器,序列化会有风险吗?“活动到活动”序列化更安全。请提供此语句的链接好吗?@Blundell否我的意思是实现序列化接口有风险,句号。有关实现可序列化接口checkout@Kurtis Ah的风险的详细信息,当然,如果用户使用v1.3序列化某些数据,那么更改对象1.4版可能会丢失他们保存的数据。谢谢链接,今晚我的睡前阅读;-)但是要使用ObjectOutputStream,我们不需要一个实现可序列化而不是可序列化的对象吗?你可以在包装器对象上设置可序列化,并在所有实际要存储的对象中设置可序列化。我根本不需要可序列化,我可以使用可序列化。但正如我提到的250节点树,它需要5秒而不是之前的1秒。大大降低了性能。5秒是从文件系统加载时,而不是在活动之间传递。