我有一个由ArrayList组成的疯狂结构,每个项目都包含一个对象的ArrayList。这些对象可以是long数组或String。我需要序列化这个疯狂的结构,但我无法实现我的目标。之后反序列化怎么样? 我理解序列化和反序列化的基础知识但不确定这样的结构。非常感谢你的帮助。
我的工作:
private void writeObject(ObjectOutputStream oos) throws IOException
{ oos.defaultWriteObject();
// Write out all elements in the proper order.
for (Object ohs : openingHours.getAllOpeningHours())
{
oos.writeObject(ohs);
// ArrayList<Object> times = (ArrayList<Object>)ohs;
// for(Object oh:times)
// if (oh instanceof String)
// {
// oos.writeChars((String) oh);
// } else if (oh instanceof long[])
// {
// long[] time = (long[])oh;
// oos.writeLong(time[0]);
// oos.writeLong(time[1]);
// }
}
}
&#34; ohs&#34;类型对象应该始终是ArrayList,我发现它应该已经可以封装,但我想它不是那么简单
答案 0 :(得分:0)
所以,正如经常发生的那样,在发布问题之后我才意识到出了什么问题。如果有人有类似的问题,这是解决方案。
我有一个对象的ArrayList,其中一个属性叫做OpeningHours。 OpeningHours是一个POJO,有一个属性类型为ArrayList&gt;对象可以是long [2]或String。 我得到一个错误,说OpeningHours不可序列化......好吧,事实并非如此。 所以我把它编辑成以下形式: 我用ArrayList&gt;扩展了OpeningHours类。由于ArrayList本身已经可序列化,因此它可以使用默认的序列化。
FileOutputStream fosp = mContext.openFileOutput(FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream oosp = new ObjectOutputStream(fosp);
oosp.writeObject(mBusinessSet); //mBusiness set is ArrayList or Business.
//Business contains OpeningHours attribute
答案 1 :(得分:0)
我看到了您的代码现在正在运行的评论,但这是您的代码片段中的两个观察结果。
首先,您正在使用具有long []数据类型的instanceof运算符,这是一种原始数据类型。运算符的实例不能与原始数据类型一起使用。
其次,尝试将long []值存储在arraylist而不是long []中,因为Long已经实现了可序列化的类。
答案 2 :(得分:0)
我建议将你的“疯狂结构”改成你觉得更舒服的形式。在另一个对象列表中有一个对象列表,其中第二个列表可以包含long [2]或String,看起来你的设计可能需要一些评论。
我不知道为什么你需要用String和long []来表示开放时间,但是如果你将它们移动到实现Serializable的单独类中,我想它不会有害。
这样的事情:
public class OpeningHours implements Serializable{
private interface OpeningHour{
public long[] getOpeningHourLongs();
public String getOpeningHourString();
}
public static final class LongArrayOpeningHour implements OpeningHour, Serializable{
private final long[] openingHour;
public LongArrayOpeningHour(long[] openingHour) {
super();
assert openingHour.length == 2;
this.openingHour = openingHour;
}
@Override
public long[] getOpeningHourLongs() {
return openingHour;
}
@Override
public String getOpeningHourString() {
return null; // ??
}
@Override
public String toString() {
return Arrays.toString(openingHour);
}
}
public static final class StringOpeningHour implements OpeningHour, Serializable{
private static final long serialVersionUID = -8424663833219027462L;
private final String openingHour;
public StringOpeningHour(String openingHour) {
super();
this.openingHour = openingHour;
}
@Override
public long[] getOpeningHourLongs() {
return null; // ??
}
@Override
public String getOpeningHourString() {
return openingHour;
}
@Override
public String toString() {
return openingHour;
}
}
private final List<OpeningHour> openingHours;
public OpeningHours() {
this.openingHours = new ArrayList<>();
}
public void addOpeningHour(OpeningHour hour){
this.openingHours.add(hour);
}
@Override
public String toString() {
return openingHours.toString();
}
public static void main(String[] args) {
OpeningHours openingHours = new OpeningHours();
openingHours.addOpeningHour(new StringOpeningHour("I am an opening hour based on a String value"));
openingHours.addOpeningHour(new LongArrayOpeningHour(new long[]{1,2}));
System.out.println("openingHours before serialization: " + openingHours );
// write OpeningHours
OutputStream fos = null;
String filename = ... // insert filename here
try {
fos = new FileOutputStream( filename );
ObjectOutputStream o = new ObjectOutputStream( fos );
o.writeObject(openingHours);
} catch (IOException e) {
System.err.println(e);
} finally {
if (fos != null) {
try {fos.close();} catch (IOException e1) {}
}
}
// read OpeningHours
InputStream fis = null;
try{
fis = new FileInputStream( filename );
ObjectInputStream o = new ObjectInputStream( fis );
openingHours = (OpeningHours) o.readObject();
System.out.println("openingHours after deserialization: " + openingHours );
} catch (IOException e) {
System.err.println( e );
} catch ( ClassNotFoundException e ) {
System.err.println( e );
}finally {
if (fis != null) {
try {fis.close();} catch (IOException e1) {}
}
}
}
}
我相信为这些结构设置单独的类肯定会提高代码的可读性,并且可以帮助您更好地维护和理解代码。