Java 读取和写入包含要传入的可包裹对象的ArrayList的ArrayList

Java 读取和写入包含要传入的可包裹对象的ArrayList的ArrayList,java,android,android-intent,arraylist,parcelable,Java,Android,Android Intent,Arraylist,Parcelable,我刚刚将项目中所有可序列化的类都更改为可打包的类。 除了一个由包含另一个ArrayList的ArrayList组成的类之外,所有的东西都工作得很好。我已经调试过了。 写入此ArrayList时没有错误。但是我在读的时候出错了 这是发生错误的类: public class Timetable implements Parcelable { private int actLap = 0; private ArrayList<Lap> timetable; private ArrayLis

我刚刚将项目中所有可序列化的类都更改为可打包的类。 除了一个由包含另一个ArrayList的ArrayList组成的类之外,所有的东西都工作得很好。我已经调试过了。 写入此ArrayList时没有错误。但是我在读的时候出错了

这是发生错误的类:

public class Timetable implements Parcelable
{
private int actLap = 0;
private ArrayList<Lap> timetable;
private ArrayList<Location> loggedLocations;
private Date startTime; ...
...
public void writeToParcel(Parcel out, int flags)
{
    out.writeInt(actLap);
    out.writeTypedList(timetable); //no error here
    out.writeTypedList(loggedLocations); ...
...
    private Timetable(Parcel in)
{
    actLap          = in.readInt();
    in.readTypedList(timetable, Lap.CREATOR); //error after this line
    in.readTypedList(loggedLocations, Location.CREATOR);
    startTime       = (Date)in.readSerializable();
    bestLap         = in.readParcelable(Lap.class.getClassLoader());
    track           = in.readParcelable(Track.class.getClassLoader());
    description     = in.readString();
}
public类时间表实现可包裹
{
私有int actLap=0;
私人ArrayList时间表;
私有阵列列表日志位置;
私人约会开始时间。。。
...
公共无效写入包(包出,内部标志)
{
外写(actLap);
out.writeTypedList(时间表);//这里没有错误
out.writeTypedList(loggedLocations)。。。
...
私人时间表(包裹内)
{
actLap=in.readInt();
in.readTypedList(timeline,Lap.CREATOR);//此行后出错
in.readTypedList(loggedLocations,Location.CREATOR);
.readSerializable()中的startTime=(日期);
bestLap=in.readParcelable(Lap.class.getClassLoader());
track=in.readParcelable(track.class.getClassLoader());
description=in.readString();
}
以下是其他课程:

public class Lap implements Parcelable
{   
private ArrayList<Time> sectorTimes = new ArrayList<Time>();
private Time laptime; ...
...
public void writeToParcel(Parcel out, int flags)
{
    out.writeTypedList(sectorTimes);
    out.writeParcelable(laptime,flags);
}

public static final Parcelable.Creator<Lap> CREATOR = new Parcelable.Creator<Lap>()
{
    public Lap createFromParcel(Parcel in)
    {
        return new Lap(in);
    }

    public Lap[] newArray(int size)
    {
        return new Lap[size];
    }
};

private Lap(Parcel in)
{
    in.readTypedList(sectorTimes, Time.CREATOR);
    laptime     = in.readParcelable(Time.class.getClassLoader());
}
公共类Lap实现可包裹
{   
private ArrayList sectorTimes=new ArrayList();
私人时间。。。
...
公共无效写入包(包出,内部标志)
{
out.writeTypedList(sectorTimes);
输出。可写可执行(洛杉矶时间、标志);
}
public static final Parcelable.Creator=新建Parcelable.Creator()
{
公共地块(地块中)
{
返回新圈数(英寸);
}
公共数组(整数大小)
{
返回新的圈数[尺寸];
}
};
私人包裹(包裹内)
{
in.readTypedList(sectorTimes,Time.CREATOR);
laptime=in.readParcelable(Time.class.getClassLoader());
}
这门课:

public class Time implements Parcelable
{
private long timeLong;
private String timeString;...
...
public void writeToParcel(Parcel out, int flags)
{
    out.writeLong(timeLong);
    out.writeString(timeString);
}

public static final Parcelable.Creator<Time> CREATOR = new Parcelable.Creator<Time>()
{
    public Time createFromParcel(Parcel in)
    {
        return new Time(in);
    }

    public Time[] newArray(int size)
    {
        return new Time[size];
    }
};

private Time(Parcel in)
{
    timeLong = in.readLong();
    timeString = in.readString();
}
public类时间实现可包裹
{
私人长时间;
私有字符串时间字符串;。。。
...
公共无效写入包(包出,内部标志)
{
out.writeLong(timeLong);
out.writeString(timeString);
}
public static final Parcelable.Creator=新建Parcelable.Creator()
{
公共时间createFromParcel(地块中)
{
返回新时间(in);
}
公共时间[]新数组(整数大小)
{
返回新的时间[大小];
}
};
私人时间(包裹内)
{
timeLong=in.readLong();
timeString=in.readString();
}
正如我已经说过的,一切都很好(有更多的可打包类,我会传递它们(包括一个ArrayList)并将它们保存在文件中)。 你们能帮我写和读那个双数组列表吗?
提前感谢

如果您的代码是发布的,那么您只是错过了ArrayList的初始化,即

private Timetable(Parcel in)
{
    // readTypeList() needs an existing List<> to load.
    timetable = new ArrayList<Lap>();
    loggedLocations = new ArrayList<Location>();

    actLap          = in.readInt();
    in.readTypedList(timetable, Lap.CREATOR);
    in.readTypedList(loggedLocations, Location.CREATOR);
    ...
私人时刻表(包裹入内)
{
//readTypeList()需要加载现有列表。
时间表=新的ArrayList();
loggedLocations=newArrayList();
actLap=in.readInt();
in.readTypedList(时间表、圈数、创建者);
in.readTypedList(loggedLocations,Location.CREATOR);
...

谢谢!这解决了我的问题。我想这个方法会创建一个新的Arraylist。非常感谢您的分享。太好了!