Android:从Parcelable到Serializable的任何快捷方式,而不使用marshall()?

时间:2011-05-05 11:06:44

标签: android marshalling serializable parcelable

我知道Parcelable(快)和Serializable(慢)之间的性能差异。但是,我需要持久存储某些应用程序信息,而不仅仅是在一个生命周期内,因此onSaveInstanceState和使用Parcelable对象的相关方法是不合适的。

所以我把注意力转向Serializable。我主要有AbstractList种类型存储 - 这很好,因为它们实现了Serializable。但是,我在其中存储的许多类型都是Parcelable但不是Serializable,例如RectF

我认为“没问题”,因为我可以通过Parcelable.writeToParcel(parcel, flags)轻松生成包裹,然后在其上调用marshall()来创建byte[]我可以序列化和反序列化。我想我会使用泛型;创建一个SerializableParcelable<Parcelable> implements Serializable类,为我希望序列化的所有Parcelable类型提供一个适合的解决方案。然后我会...将此包装器中的每个RectF存储在ArrayList内,并且看好列表,其Parcelable内容是可序列化的。

但是,API文档规定marshall()不得用于持久存储:

  

公共最终字节[] marshall()

     

返回宗地的原始字节。

     

您在此处检索的数据不得放置在任何类型的永久存储中(在本地磁盘上,通过网络等)。为此,您应该使用标准序列化或其他类型的通用序列化机制。 Parcel编组表示针对本地IPC进行了高度优化,因此不会尝试与在不同版本的平台中创建的数据保持兼容。

所以现在我被卡住了。我可以忽略这个警告并遵循我上面概述的路线,或者通过扩展每个人Parcelable我想要序列化和创建定制的序列化方法来避免这个问题,这似乎非常浪费时间和精力。 / p>

有没有人知道在不使用Parcelable的情况下序列化marshall()对象的“正确”快捷方式?或者,如果不注意指定的警告,我应该继续吗?也许SQLite数据库是可行的方法,但我不确定并希望得到你的建议。

非常感谢。

1 个答案:

答案 0 :(得分:-1)

对于您需要序列化的任何对象,您可以使用objectOutPutStream。通过使用它,您可以将对象写入设备的文件系统。因此,这也可用于保存Parcelable个对象。

以下是将对象保存到文件系统的代码。

    public static void witeObjectToFile(Context context, Object object, String        filename) {

    ObjectOutputStream objectOut = null;
    FileOutputStream fileOut = null;
    try {
        File file = new File(filename);
        if(!file.exists()){
            file.createNewFile();
        }
        fileOut = new FileOutputStream(file,false);
        objectOut = new ObjectOutputStream(fileOut);
        objectOut.writeObject(object);
        fileOut.getFD().sync();

    } catch (IOException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }finally {
        if (objectOut != null) {
            try {
                objectOut.close();
            } catch (IOException e) {
                // do nowt
            }
        }
        if (fileOut != null) {
            try {
                fileOut.close();
            } catch (IOException e) {
                // do nowt
            }
        }
    }
}`

为了阅读对象使用ObjectInputStream。找到以下代码。

    public static Object readObjectFromFile(Context context, String filename) {

    ObjectInputStream objectIn = null;
    Object object = null;
    FileInputStream fileIn = null;
    try {
        File file = new File(filename);
        fileIn = new FileInputStream(file);//context.getApplicationContext().openFileInput(filename);
        objectIn = new ObjectInputStream(fileIn);
        object = objectIn.readObject();

    } catch (FileNotFoundException e) {
        // Do nothing
    }catch (NullPointerException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }finally {
        if (objectIn != null) {
            try {
                objectIn.close();
            } catch (IOException e) {
                // do nowt
            }
        }
        if(fileIn != null){
            try {
                fileIn.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    return object;
}`

的问候,