序列化ArrayList <arraylist <object>&gt; </arraylist <object>

时间:2014-02-04 12:32:10

标签: java arrays serialization deserialization

我有一个由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,我发现它应该已经可以封装,但我想它不是那么简单

3 个答案:

答案 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) {}
        }
    }
}

}

我相信为这些结构设置单独的类肯定会提高代码的可读性,并且可以帮助您更好地维护和理解代码。