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)
    ...
    ...
    ...
    ...