当前位置: 首页 > 知识库问答 >
问题:

序列化ArrayList

贡光明
2023-03-14

我有一个由ArrayList组成的疯狂结构,每个项目都包含一个ArrayList of Object。这些对象可以是长数组或字符串。我需要序列化这个疯狂的结构,但无法实现我的目标。之后反序列化怎么样?我了解序列化和反序列化的基础知识,但不确定这样的结构。非常感谢您的帮助。

我的作品:

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]);
//            }
    }
}

Object类型的“ohs”应该始终是ArrayList,我发现它应该已经可以序列化了,但我想它并没有那么简单

共有3个答案

夏祺然
2023-03-14

我建议将您的“疯狂结构”更改为您感觉更舒服的形式。在另一个对象列表中包含一个对象列表,其中第二个列表可以包含一个长[2]或一个字符串,看起来您的设计可能需要一些审查。

我不知道为什么需要用一个字符串和一个长[]来表示开放时间,但我想如果将它们移动到实现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) {}
        }
    }
}

}

我相信为这些结构提供单独的类肯定会提高代码的可读性,并从长远来看有助于更好地维护和理解代码。

关学
2023-03-14

我看到了您的代码正在运行的注释,但下面是您的代码片段中的两个观察结果。

首先是您使用的instanceof运算符具有long[]数据类型,这是原始数据类型。运算符实例不能与原始数据类型一起使用。

其次,尝试将Long[]值存储在数组列表中,而不是long[],因为Long已经实现了可序列化类。

仲孙子辰
2023-03-14

所以,就像经常发生的那样,在发布问题后,我意识到哪里出了问题。如果有人有类似的问题,这里是解决方案

我有一个对象的ArrayList,它们的一个属性称为OpeningHour。OpeningHour是一个POJO,有一个属性是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
 类似资料:
  • 问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是

  • 我正在尝试使用kryo序列化和反序列化到二进制。我想我已经完成了序列化,但似乎无法反序列化。下面是我正在处理的代码,但最终我想存储一个字节[],然后再次读取它。文档只显示了如何使用文件。

  • 问题内容: 每当我尝试序列化文件时,都会收到错误消息:FileNotFound。不知道为什么。这是我的FileHelper代码: 问题答案:

  • 问题内容: 我尝试过在Java和Android之间实现跨平台序列化。我使用了Serializable,并将我的代码在Android中与台式机Java放在同一软件包中。 来源:java-desktop序列化 资料来源:Android-反序列化 学生是一类,实现了Serializable。在桌面上,我将学生实例序列化为“ thestudent.dat”。我将此文件放在Android设备上的SD卡上,并

  • 问题内容: 我注意到存储在Redis中的某些序列化对象在反序列化方面遇到问题。 当我对Redis中存储的对象类进行更改时,通常会发生这种情况。 我想了解问题,以便为解决方案设计一个清晰的方案。 我的问题是,什么导致反序列化问题?移除公共/私人财产会引起问题吗?也许添加新属性?向类添加新功能会产生问题吗?那么更多的构造函数呢? 在我的序列化对象中,我有一个属性Map,如果我更改(更新了一些属性,添加

  • 问题内容: Golang中将结构序列化和反序列化为字符串的最佳方法(完整性和性能)是什么,反之亦然? 例如,如果我有这个结构: 我想将其存储在Redis上并取回。我试过保存,整型和字符串,这很好,但是如何存储结构对象? 问题答案: 使用gob和base64可以解决问题,例如: 当您需要序列化自定义结构或类型(例如struct)时,只需添加以下行:

  • 主要内容:1 Java序列化和反序列化,2 Java序列化的优点,3 java.io.Serializable接口,4 Java ObjectOutputStream,5 Java ObjectInputStream,6 Java序列化的例子,7 Java反序列化的例子1 Java序列化和反序列化 Java中的序列化是一种将对象状态写入字节流的机制。它主要用于Hibernate,RMI,JPA,EJB和JMS技术。 序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台

  • FAQs in section [36]: [36.1]“序列化”是什么东东? [36.2] 如何选择最好的序列化技术? [36.3] 如何决定是要序列化为可读的(“文本”)还是不可读的(“二进制”)格式? or non-human-readable ("binary") format?") [36.4] 如何序列化/反序列化数字,字符,字符串等简单类型? [36.5] 如何读/写简单类型为可读的