首页 > 解决方案 > Java Serializable vs Android Parcelable

问题描述

我目前正在开发一个 Android 应用程序(我是开发 Android 应用程序的初学者),我正在实现一个非常简单的类,它能够处理位置(纬度、经度)和相应的地址(通过使用 Geocoder API )。我希望我的应用程序能够在两个活动之间传输我的类的一个实例并返回结果,这样的结果也是该类的一个实例。

我已经编写了我的类的声明来实现Parcelable类,如下所示(我的类名是OnePlace):

public class OnePlace implements Parcelable {

    private LatLng position;
    private String address;
    …
}

我已经使用能够实现Parcelable的方法实现了“OnePlace”类,正如 Android 开发人员在线文档中推荐的那样: https ://developer.android.com/reference/android/os/Parcelable

一切正常,我能够将我的类的一个实例从一个活动转移到另一个活动,并因此得到另一个实例。

这是我将类的实例添加为与意图一起发送的数据的片段代码:

OnePlace item = new OnePlace(); // create an instance of the class with default values
Intent mapIntent = new Intent(adapterView.getContext(), MapsActivity.class);
mapIntent.putExtra("place", item); // add the item as extra data to the intent
startActivityForResult(mapIntent, 35);

在被调用的活动(此处为 MapsActivity)中,我能够重建类实例的精确副本。

无论如何,这行得通,我对此感到满意。

现在,我想将我的类的实例存储在一个文件中,当我下次启动我的应用程序时将读取该文件(一种永久存储的方法)。

为此,我在我的活动的finish()方法中使用以下代码片段(就在离开我的应用程序之前):

FileOutputStream outStream = openFileOutput("myFile.tmp", Context.MODE_PRIVATE);
ObjectOutputStream objectStream = new ObjectOutputStream(outStream);

objectStream.writeObject(item);

objectStream.close();
outStream.close();

如您所见,我使用ObjectOutputStream类和FileOutputStream类来写入文件。item对象是我的OnePlace类的一个实例。正是我想永久存储到文件中的那个实例,以便下次能够取回它。

当我调用writeObject(...)方法时,调用以异常“Object not serializable”结束。在阅读了一些在线文档后,明确指出我要“序列化”的类应实现Serializable接口(这是强制性的!)。

因此,我更新了我的类的定义,如下所示:

public class OnePlace implements Parcelable, Serializable {
    private LatLng position;
    private String address;
    …

我稍微修改了我的类的定义以实现ParcelableSerializable接口。我不知道这是否是满足我需求的最佳方式……</p>

当我想调用intent.putExtra("key", item); ,我得到一个错误。事实上,Java 编译器抱怨它不知道它应该实现哪个putExtra接口:带有 Parcelable 接口的接口还是带有 Serializable 接口的接口?它的反应似乎是合乎逻辑的,我认为如果我是一名人类编译器,我可能会问同样的问题。

那么,现在,我该如何解决这个问题呢?有人有想法吗?也许,我想实现我的两个目标(将类实例转移到另一个活动并永久存储一个实例)的方式不是最好的方式?你有什么建议吗?

我非常感谢您的回答。

查尔斯

标签: androidparcelableserializable

解决方案


我推荐你在Activity、Fragments之间传递数据时使用Gson序列化。这是一个非常简单和轻量级的库。您的应用示例;

Gson gson = new  Gson();
OnePlace item = new OnePlace(); // create an instance of the class with default values
Intent mapIntent = new Intent(adapterView.getContext(), MapsActivity.class);
mapIntent.putExtra("place", gson.toJson(item)); // add the item as extra data to the intent
startActivityForResult(mapIntent, 35);

在 MapsActivity.class

Gson gson = new  Gson();
String jsonPlace = getIntent().getStringExtra("place");
Place passedItem = gson.fromJson(jsonPlace, Place.class);

推荐阅读