gpt4 book ai didi

java - 序列化对象时出现 StackOverflowError

转载 作者:行者123 更新时间:2023-11-30 05:50:50 24 4
gpt4 key购买 nike

我想用这个方法序列化一个对象:

public void serializ(CRDT m) throws IOException {
ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
ObjectOutputStream stream = new ObjectOutputStream(byteOutput);
stream.writeObject(m);
sumMemory = byteOutput.size();

stream.flush();
stream.close();
byteOutput.flush();
byteOutput.close();
}

我有一个异常 java.lang.StackOverflowError

Exception in thread "main" java.lang.StackOverflowError
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1169)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
...

我在一些论坛上看到我需要重新实现 writeObject/readObject 方法。这是唯一可能的解决方案吗?以及如何重新实现 writeObject/readObject

我要序列化的对象是: http://pastebin.com/D1kEidtn

导致错误的两个类是: pastebin.com/Sb3X0Quqenter link description here

最佳答案

CRDT 是被序列化的对象 m 的父类(super class)。错误是从 CRDT 派生的类似乎有对自身的引用,导致无限递归
您会在堆栈跟踪中看到它。
Tipp 通过使用调试器或在 serialize() 方法的开头添加 System.out.println(m.getClass()) 来找出对象 CRDT m: 的类。然后当你知道类时,检查对象是否有对自身的引用。

关于java - 序列化对象时出现 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13541778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com