关于 java:使用返回不正确布尔值的布尔数组列表反序列化对象

deserializing object with arraylist of booleans returning incorect boolean values

我目前正在为 android 上的闹钟创建一个应用程序,我遇到了一个问题,我希望这里有人能澄清一下。基本上我序列化一些对象并保存到文件中。这些对象每个都包含一个布尔类型的数组列表。代表警报应该响起的日子。我似乎能够很好地读取和读取序列化的"alarm_entity"对象,但我有一个问题。一旦"alarm_entity"对象被反序列化,每个对象中的数组列表似乎会错误地返回某些索引处的布尔值。一个例子是 1. 我将天的状态保存在代表一周中的天的复选框中 2. 重新启动设备。然后打开应用程序,布尔值在 GUI 中的表示不正确。例如,我有一个闹钟,并在相关复选框中将日期设置为"星期一"和"星期四",重新启动复选框时,我将设置为"星期一"和"星期五"。下面是我的"alarm_entity"类,它被序列化了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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;
}
}

我已尝试在单元测试中测试此代码,它似乎工作正常,并且布尔值被反序列化,与保存时相同。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@Override
public synchronized void writeToFile(final ArrayList 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 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");
}

如果有人能为我阐明这一点,那就太好了,因为我现在有点迷失了。我认为这个问题可能是由于序列化对象中的数组列表。无论如何提前谢谢。


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

你正在使用 days.add(pos, state); 这个方法在那个位置插入数据。
要替换使用 days.set(pos, state); 代替。

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