使用返回不正确的布尔值的布尔数组列表反序列化对象
deserializing object with arraylist of booleans returning incorect boolean values
我目前正在 android 上创建一个闹钟应用程序,我 运行 遇到了一个问题,我希望这里有人可以澄清。基本上我序列化一些对象并保存到文件中。这些对象每个都包含一个布尔类型的数组列表。代表闹钟应该响起的日子。我似乎能够很好地读入和读出序列化的 "alarm_entity" 对象,但我有一个问题。一旦 "alarm_entity" 对象被反序列化,每个对象中的数组列表似乎错误地返回了某些索引处的布尔值。一个例子是 1. 我将日期状态保存在代表一周中的几天的复选框中 2. 重新启动设备。然后打开应用程序,布尔值在 GUI 中的表示不正确。例如,我有一个闹钟,并在相关复选框中将日期设置为 "monday" 和 "thursday",重新启动时我将在 "monday" 和 "friday" 上设置复选框。下面是我的 "alarm_entity" class 序列化。
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;
}
}
我已经尝试在单元测试中测试此代码它似乎工作正常并且布尔值被反序列化为与保存时相同。
下面是我写报警对象的方法
@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");
}
如果有人能为我阐明这一点,那就太好了,因为我现在有点不知所措。我认为问题可能是由于序列化对象中的数组列表引起的。无论如何,先谢谢了。
您的 setDay(int pos, boolean state)
不正确。
您正在使用days.add(pos, state);
此方法在该位置插入数据。
要替换,请改用 days.set(pos, state);
。
查看文档 List.set(int, E) and List.add(int, E)
我目前正在 android 上创建一个闹钟应用程序,我 运行 遇到了一个问题,我希望这里有人可以澄清。基本上我序列化一些对象并保存到文件中。这些对象每个都包含一个布尔类型的数组列表。代表闹钟应该响起的日子。我似乎能够很好地读入和读出序列化的 "alarm_entity" 对象,但我有一个问题。一旦 "alarm_entity" 对象被反序列化,每个对象中的数组列表似乎错误地返回了某些索引处的布尔值。一个例子是 1. 我将日期状态保存在代表一周中的几天的复选框中 2. 重新启动设备。然后打开应用程序,布尔值在 GUI 中的表示不正确。例如,我有一个闹钟,并在相关复选框中将日期设置为 "monday" 和 "thursday",重新启动时我将在 "monday" 和 "friday" 上设置复选框。下面是我的 "alarm_entity" class 序列化。
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;
}
}
我已经尝试在单元测试中测试此代码它似乎工作正常并且布尔值被反序列化为与保存时相同。
下面是我写报警对象的方法
@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");
}
如果有人能为我阐明这一点,那就太好了,因为我现在有点不知所措。我认为问题可能是由于序列化对象中的数组列表引起的。无论如何,先谢谢了。
您的 setDay(int pos, boolean state)
不正确。
您正在使用days.add(pos, state);
此方法在该位置插入数据。
要替换,请改用 days.set(pos, state);
。
查看文档 List.set(int, E) and List.add(int, E)