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

序列化包含对象的ArrayList的对象

呼延景同
2023-03-14
public class User  implements  Serializable{

    public String name;
    public String surname;
    public List<Picked> pickedBooks = new ArrayList<>();

    // Code omitted.
}

然后是班级选拔:

public class Picked {

    public Book book;
    public int period;
    public int cost;

    // Code omitted.
}

教材:

public class Book {

    public String name;
    public String bookTitle;
    public int howMany;

    // Code omitted.
}

因此,我主要创建新用户并将其序列化:

User user = new User();
user.setName("John");
user.setSurname("James");
String fileName = "data.bin";
try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(fileName))) {
    os.writeObject(user);
} catch (IOException ex) {
    Logger.getLogger(Library.class.getName()).log(Level.SEVERE, null, ex);
}

一切都很完美,但如果我这样做:

Book book = new Book("Dan Brown", "Angels and Demons", 1);
Picked pck = new Picked(book, 20, 2);
user.add(pck);

然后我想序列化对象用户,程序崩溃了。我得到的结果是:

JAVA木卫一。NotSerializableException:在java上。木卫一。ObjectOutputStream。java上的WriteObject 0(ObjectOutputStream.java:1183)。木卫一。ObjectOutputStream。java上的writeObject(ObjectOutputStream.java:347)。util。ArrayList。sun上的writeObject(ArrayList.java:742)。反映NativeMethodAccessorImpl。在sun上调用0(本机方法)。反映NativeMethodAccessorImpl。在sun上调用(NativeMethodAccessorImpl.java:57)。反映DelegatingMethodAccessorImpl。在java上调用(DelegatingMethodAccessorImpl.java:43)。朗。反思。方法在java上调用(Method.java:606)。木卫一。ObjectStreamClass。java上的invokeWriteObject(ObjectStreamClass.java:988)。木卫一。ObjectOutputStream。在java上编写SerialData(ObjectOutputStream.java:1495)。木卫一。ObjectOutputStream。java上的writeOrdinaryObject(ObjectOutputStream.java:1431)。木卫一。ObjectOutputStream。java上的WriteObject 0(ObjectOutputStream.java:1177)。木卫一。ObjectOutputStream。java上的defaultWriteFields(ObjectOutputStream.java:1547)。木卫一。ObjectOutputStream。在java上编写SerialData(ObjectOutputStream.java:1508)。木卫一。ObjectOutputStream。java上的writeOrdinaryObject(ObjectOutputStream.java:1431)。木卫一。ObjectOutputStream。java上的WriteObject 0(ObjectOutputStream.java:1177)。木卫一。ObjectOutputStream。writeObject(ObjectOutputStream.java:347)

共有2个答案

米楷
2023-03-14

如果您的对象没有实现java。木卫一。Serializable此代码抛出NotSerializableException,这同样适用于其所有非静态和非瞬态数据成员,以此类推,直到闭包。使用指定的SerialVersionUID更好,所以JVM不会在运行时计算它。还请实现可序列化到Picked和Book类。

对于数组或集合,数组或集合的所有对象都必须是可序列化的。如果任何对象不可序列化,则序列化将失败。

如果类中有内部类,则内部类始终包含对其外部类的隐式引用,则无法序列化内部类,除非外部类也可序列化。实际上,甚至不建议尝试;

查看此参考资料http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serial-arch.html#4539

幸越泽
2023-03-14

PickedBook也需要实现Serializable

 类似资料:
  • 问题内容: 顾名思义,我正在尝试将包含一些BufferedImages(包括其他变量,字符串等)的对象保存到文件中。 我发现了这一点: 如何序列化包含BufferedImages的对象 它的工作原理就像一种魅力,但有一点点挫折:如果您的对象仅包含一个图像,它就可以很好地工作。 我一直在努力获取他的解决方案以处理多个图像(理论上应该可以使用),但是每次读入文件时,我都会得到对象,图像数量正确,但只有

  • 问题内容: 我有一个对象(解析树),其中包含子节点,这些子节点是对其他节点的引用。 我想使用序列化此对象,但是我得到了 TypeError:循环对象值 因为我提到的结构。 我该如何解决?对我而言,在序列化对象中是否表示对其他节点的引用并不重要。 另一方面,在创建对象时从对象中删除这些属性似乎很乏味,我也不想对解析器(水仙)进行更改。 问题答案: 使用的第二个参数,该替代品的功能,以排除已序列化对象

  • 问题内容: 我正在尝试用Java创建一个简单的图像编辑程序。我制作了一个对象,其中包含有关正在编辑的图像的所有信息(一些基本属性,所应用的效果列表,层列表等),我想要一种简单的方法将其保存到磁盘,以便稍后再次打开。 我发现使用Java的defualt 接口可能正是我想要的,我可以将整个对象写到文件中,稍后再读回内存中。但是,包括和不能序列化(其他所有方法都可以)。 我知道可以重写和方法,但我从未这

  • 问题内容: 是否有可能创造 ; 我的意思是将来自不同类的对象添加到一个arraylist? 谢谢。 问题答案: 是的,有可能: 该列表将接受任何实现的对象。

  • 问题内容: 你好(对不起我的英语) 我正在开发使用Spring SPRING MVC的json前端网站消耗Web服务的Web服务。spring mvc使用JsonIdentityInfo选项进行序列化,因此每个对象仅在json中写入一次,并且每次都使用引用进行写入,例如她使用相同的对象“ component”有2个“ computer”,因此spring将ID设置为第一个组件(“ @compone

  • 我试图调用一个restendpoint,它返回一个pojo对象,如下所示: 以下是电话: 问题是我已经尝试了一些方法,例如忽略 OffsetDateTime 属性或尝试更改该日期的格式,但它会引发此错误: 否则它将返回空:(解决这个问题的好解决方案是什么?