Serialization java对象序列化中嵌套对象基元值上的java.lang.StackOverflower异常
我有Serialization java对象序列化中嵌套对象基元值上的java.lang.StackOverflower异常,serialization,data-structures,java-8,range-tree,Serialization,Data Structures,Java 8,Range Tree,我有RangeTreeIndex和RangeTreeNode类,我用它们来建立索引,插入2500条记录后,我试图将RangeTreeIndex对象保存在接收StackOverflowerError的文件中,下面是我的全部代码: public class RangeTreeNode<T> implements Serializable { private static final long serialVersionUID = -1; public T key;
RangeTreeIndex
和RangeTreeNode
类,我用它们来建立索引,插入2500条记录后,我试图将RangeTreeIndex
对象保存在接收StackOverflowerError
的文件中,下面是我的全部代码:
public class RangeTreeNode<T> implements Serializable {
private static final long serialVersionUID = -1;
public T key;
public Object data;
public RangeTreeNode<T> left;
public RangeTreeNode<T> right;
public RangeTreeNode() {
}
}
public class RangeTreeIndex implements Serializable {
private RangeTreeNode<Number> root;
private RangeTreeNode<Number> firstLeafNode;
private RangeTreeNode<Number> lastLeafNode;
private Number min;
private Number max;
public RangeTreeIndex() {
}
@Override
public int insert(Number key, Object values) {
Number newKey = new Double(key.doubleValue());
if (newKey.doubleValue() < min.doubleValue()) {
min = new Double(key.doubleValue());
}
if (newKey.doubleValue() > max.doubleValue()) {
max = new Double(key.doubleValue());
}
RangeTreeNode<Number> newNode = new RangeTreeNode<>(newKey, values);
this.root = this.insert(root, newNode);
if (firstLeafNode == null && lastLeafNode == null) {
firstLeafNode = newNode;
lastLeafNode = newNode;
} else if (newNode.key.doubleValue() < firstLeafNode.key.doubleValue()) {
firstLeafNode = newNode;
} else if (newNode.key.doubleValue() > lastLeafNode.key.doubleValue()) {
lastLeafNode = newNode;
}
return 1;
}
private RangeTreeNode<Number> insert(RangeTreeNode<Number> parentNode, RangeTreeNode<Number> newNode) {
if (parentNode == null) {
parentNode = newNode;
} else {
if (newNode.key.doubleValue() <= parentNode.key.doubleValue()) {
parentNode.left = insert(parentNode.left, newNode);
} else {
parentNode.right = insert(parentNode.right, newNode);
}
}
return parentNode;
}
}
public class Main {
public static void main(String args[]) throws IOException {
String filePath = "XYZ.jobject";
try (RandomAccessFile raf = new RandomAccessFile(filePath, "rw");
FileOutputStream fOut = new FileOutputStream(raf.getFD());
BufferedOutputStream bos = new BufferedOutputStream(fOut);
ObjectOutputStream oOut = new ObjectOutputStream(bos)) {
oOut.writeObject(preferenceIndex);
}
}
}
即使我使用的是apachecommons lang
library类SerializationUtils.serialize
只传递一个可序列化的对象,它也会抛出相同的错误
有人能像对待原始值那样面对这个问题吗?原始值是一个骗局。当堆栈耗尽时,任何后续的方法调用都可能结束,而无需自行负责。问题不是最深层的方法调用处理一个
double
,而是堆栈上已有数千个方法调用。不幸的是,序列化以高堆栈消耗而闻名。要检查的一件事是,这棵树是否平衡。不平衡的树也可能会在其他地方导致性能问题。感谢您的回答,树是不平衡的,但我认为我发现了一个小问题,那就是我应该创建一个列表来存储同一个键的数据,而不是再次放入左节点。
Exception in thread "Thread-5" java.lang.StackOverflowError
at java.lang.Double.doubleToLongBits(Double.java:836)
at java.io.Bits.putDouble(Bits.java:121)
at java.io.ObjectStreamClass$FieldReflector.getPrimFieldValues(ObjectStreamClass.java:2168)
at java.io.ObjectStreamClass.getPrimFieldValues(ObjectStreamClass.java:1389)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1533)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
...
...
...
...