Parcelable遇到IOException编写可序列化对象

基本上我通过了这个教程http://mindtherobot.com/blog/37/android-architecture-tutorial-developing-an-app-with-a-background-service-using-ipc/

因为它或多或少是我想要实现的。 我希望我的GPS服务在后台运行,不断收集GPS坐标并将它们保存到arrays,这样用户可以换到另一个活动并返回到地图活动,并让它仍然绘制最多的整个记录​​路径。

所以我实现了这个教程来设置IPC,它似乎或多或少有效,但是我在将数据恢复到我的Activity时遇到了问题。 这是我的文件,首先是我的Parcelable对象,它是一个包含GPSObject的列表。 接下来是我的GPSObject,它只是一个可序列化的对象,包含来自android Location对象的一些信息。

package com.android.SnowFever; import java.util.ArrayList; import java.util.List; import com.android.SnowFever.*; import com.google.android.maps.GeoPoint; import android.os.Parcel; import android.os.Parcelable; public final class GPSResult implements Parcelable { public static final Creator CREATOR = new Creator() { @Override public GPSResult[] newArray(int size) { return new GPSResult[size]; } @Override public GPSResult createFromParcel(Parcel source) { return new GPSResult(source); } }; private List geoPoints; public GPSResult() { geoPoints = new ArrayList(); } @SuppressWarnings("unchecked") private GPSResult(Parcel source) { geoPoints = source.readArrayList(GPSService.class.getClassLoader()); } public void addGPS(GPSObject location) { geoPoints.add(location); } public List getGeoPoints() { return geoPoints; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeList(geoPoints); } } 

这是我的GPSObject类

 package com.android.SnowFever; import java.io.Serializable; import com.google.android.maps.GeoPoint; import android.location.Location; public class GPSObject implements Serializable{ /** * */ private static final long serialVersionUID = 1L; float spd, acc; double lat, lng, alt; GeoPoint gp; public GPSObject(Location l) { lat = l.getLatitude() * 1E6; lng = l.getLongitude() * 1E6; alt = l.getAltitude(); spd = l.getSpeed(); acc = l.getAccuracy(); gp = new GeoPoint((int)lat,(int)lng); } } 

要将文件添加到我的GPSResult列表,我打电话

 latestGPSResult.getGeoPoints().add(new GPSObject(location)); 

我得到线程主题中包含的错误,下面是错误窗口的一大块

 11-01 18:49:06.818: E/JavaBinder(20754): *** Uncaught remote exception! (Exceptions are not yet supported across processes.) 11-01 18:49:06.818: E/JavaBinder(20754): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.android.SnowFever.GPSObject) 11-01 18:49:06.818: E/JavaBinder(20754): at android.os.Parcel.writeSerializable(Parcel.java:1176) 11-01 18:49:06.818: E/JavaBinder(20754): at android.os.Parcel.writeValue(Parcel.java:1130) 11-01 18:49:06.818: E/JavaBinder(20754): at android.os.Parcel.writeList(Parcel.java:519) 11-01 18:49:06.818: E/JavaBinder(20754): at com.android.SnowFever.GPSResult.writeToParcel(GPSResult.java:52) 11-01 18:49:06.818: E/JavaBinder(20754): at com.android.SnowFever.GPSApi$Stub.onTransact(GPSApi.java:52) 11-01 18:49:06.818: E/JavaBinder(20754): at android.os.Binder.execTransact(Binder.java:320) 11-01 18:49:06.818: E/JavaBinder(20754): at android.os.BinderProxy.transact(Native Method) 11-01 18:49:06.818: E/JavaBinder(20754): at com.android.SnowFever.GPSListener$Stub$Proxy.handleGPSUpdated(GPSListener.java:76) 11-01 18:49:06.818: E/JavaBinder(20754): at com.android.SnowFever.GPSService$GeoUpdateHandler.onLocationChanged(GPSService.java:91) 

这意味着com.android.SnowFever.GPSObject对象不可序列化。 我想GeoPoint不可序列化。 这意味着您必须实现writeObjectreadObject

我认为您的问题是GeoPoint不是Serializable对象。 我遇到了同样的问题,因为我的Class中有一个Uri正在实现Serializable接口。

就像Ciprian所说,geoPoints是一个List(接口),它不是可序列化的。 将它更改为ArrayList – 确保在设置它的值时给它一个ArrayList而不是List – 不要使用该接口,因为解析器不知道将序列化为什么。

确保您尝试序列化的结构使用的所有嵌套类都是(递归地)可序列化的。

对于序列化的复杂对象,您需要序列化每个对象,直到剩下的都是基元。 在您的情况下,您必须为GeoPoint抽象或编写容器类,以允许在应用程序中传递它。