使用布尔值的arraylist反序列化对象返回incorect布尔值

时间:2015-04-24 14:26:10

标签: java android serialization arraylist

Iam目前在Android上创建一个闹钟应用程序,我遇到了一个问题,我希望有人在这里澄清一下。基本上我序列化一些对象并保存到文件。这些对象每个都包含一个boolean类型的arraylist。代表警报应该停止的日子。我sem能够读入和读出序列化的" alarm_entity"对象很好,但我有一个问题。一旦" alarm_entity"对象被反序列化,每个对象中的arraylist似乎错误地返回某些索引处的布尔值。一个例子是1.我在表示星期几的复选框中保存日期的状态2.重新启动设备。然后打开应用程序,并在GUI中错误地表示布尔值。比方说,我有一个警报,并设定了日期"星期一"和"星期四"在相关的复选框中,重新启动我要设置​​的复选框"星期一"和"周五"。下面是我的" alarm_entity"被序列化的类。

public class alarm_entity implements Serializable {


private boolean state;
private boolean repeating;
private int hours;
private int mins;
private ArrayList<Boolean> days;
private final int numdays = 7;


 public alarm_entity(int hoursin, int minsin)
{

    days = new ArrayList<Boolean>();
    state = true;
    repeating = false;
    hours = hoursin;
    mins = minsin;
    initDays();
}


private void initDays()
{
    for(int i = 0 ; i < numdays; i++)
    {
        boolean temp = false;
        days.add(i, temp);
    }
}

public void setDay(int pos, boolean state)
{
    days.add(pos, state);
}

public ArrayList<Boolean> getDays()
{
   return days;
}




public int getMins()
{
    return mins;
}

public void setMins(int minsin)
{
    mins = minsin;
}

public boolean isState() {
    return state;
}

public int getHours()
{
   return hours;
}

public void setHours(int hoursin)
{
    hours = hoursin;
}

public void setState(boolean statein)
{
    state = statein;
}

public boolean getState()
{
    return state;
}
}

我尝试在单元测试中测试此代码似乎工作正常,并且将booleans反序列化与保存时相同。

下面是我用来编写警报对象的方法

@Override
public synchronized void writeToFile(final ArrayList<alarm_entity> alarmlist) {

    if(alarmfile == null) {

        createFile(Alarm_List.filename);
    }

    try
    {
        fostream = new FileOutputStream(alarmfile);
        oostream = new ObjectOutputStream(fostream);
        addAlarms(alarmlist);

        oostream.close();
        fostream.close();
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
        Log.e("error", "write exception");
    }


}

private void addAlarms(final ArrayList<alarm_entity> alarmlist) {

    Thread mythrd = new Thread(new Runnable() {

        @Override
        public void run() {

            for(alarm_entity alarm : alarmlist)
            {
                try {
                    oostream.writeObject(alarm);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    });

    mythrd.start();



    try {
        mythrd.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    Log.d("alarms writing", "alarms saved");
}

如果有人能为我发光,那将是很棒的,因为Iam有点迷失它。我认为问题可能是由于序列化对象中的arraylist。无论如何,提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的setDay(int pos, boolean state)不正确。

您正在使用days.add(pos, state);此方法在该位置插入数据 替换使用days.set(pos, state);代替。

查看文档List.set(int, E)List.add(int, E)