Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对图形进行反序列化会在Java中生成异常_Java_Object_Exception_Arraylist_Serialization - Fatal编程技术网

对图形进行反序列化会在Java中生成异常

对图形进行反序列化会在Java中生成异常,java,object,exception,arraylist,serialization,Java,Object,Exception,Arraylist,Serialization,我创建了一个由节点和边组成的图,如图所示: public class Edge implements Serializable { private final Node neighbor; private final double weight; public Edge(Node neighbor, double weight) { this.neighbor = neighbor; this.weight = weight; }

我创建了一个由节点和边组成的图,如图所示:

public class Edge implements Serializable {
    private final Node neighbor;
    private final double weight;

    public Edge(Node neighbor, double weight) {
        this.neighbor = neighbor;
        this.weight = weight;
    }

    public Node getNeighbor() {
        return neighbor;
    }

    public double getWeight() {
        return weight;
    }
}

public class Node implements Serializable {
    private final String name;
    private final ArrayList<Edge> edges;

    public Node(String name) {
        this.name = name;
        this.edges = new ArrayList<>();
    }

    public String getName() {
        return name;
    }

    public ArrayList<Edge> getEdges() {
        return edges;
    }

    public void addEdge(Edge edge) {
        this.edges.add(edge);
    }
}

public class Graph implements Serializable {
    private final ArrayList<Node> nodes;

    public Graph() {
        nodes = new ArrayList<>();
    }

    public Graph(ArrayList<Node> nodes) {
        this.nodes = nodes;
    }

    public ArrayList<Node> getNodes() {
        return new ArrayList<>(nodes);
    }
}
序列化工作正常(据我所知),但在反序列化过程中,会打印以下StackTrace,我无法找出原因: [更新]:(序列化时发生)

[添加]:(反序列化时发生)

我尝试了一些不同的方法,包括序列化节点本身的ArrayList和其他方法,但我无法找到它的底部。 有人能帮我修一下吗?谢谢大家!

“它就是这样做的。”

也许这不是很有帮助

序列化
节点
时,
将被递归序列化。一个
包含一个
节点
,以便递归地序列化。即使是一个适度的图,也可以得到一个合理的递归深度,并且每个递归级别都会占用相当大的堆栈空间块


链表就是这种错误的典型例子。标准技术是对整个图形使用自定义序列形式。例如,每当您遇到一个
时,您可以给它一个序列号(在
Map
中保持跟踪。使用
瞬态
节点
进行序列化,后跟一组
ID。按顺序跟踪
对象。反序列化时,将
添加回
节点
中。

您可以添加
捕获
状态吗nts请?
oOS.close();
位于一个位置,如果序列化确实引发了错误,则不会调用它。这正是您应该使用try with resources的原因,它是专门为此类情况开发的。我确实有它们,我只是没有将它们添加到这里。抱歉……我如何编辑此问题?我是StackOverflow的新手!完成。感谢您的帮助!在您的帖子末尾,在您姓名的左侧,有一系列链接“共享编辑跟随”等。它是编辑。请不要通过破坏您的帖子为其他人做更多的工作。通过在Stack Exchange网络上发布,您已授予Stack Exchange在下分发该内容的不可撤销的权利(即,无论您未来的选择如何)。根据堆栈交换策略,发布的是非故意破坏版本的帖子。因此,任何故意破坏行为都将恢复。如果您想了解有关删除帖子的更多信息,请参阅:
    public Graph deSerialize() {
        Graph graph = new Graph();
        try {
            FileInputStream inStream = new FileInputStream(aFile);
            ObjectInputStream oIS = new ObjectInputStream(inStream);
            graph = (Graph) oIS.readObject();
            oIS.close();
            inStream.close();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return graph;
    }

    private void serialize(Graph graph) {
        try {
            FileOutputStream outStream = new FileOutputStream(aFile);
            ObjectOutputStream oOS = new ObjectOutputStream(outStream);
            oOS.writeObject(graph);
            oOS.close();
            outStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Exception in thread "main" java.lang.StackOverflowError
    at java.base/java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:936)
    at java.base/java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:339)
    at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1135)
    at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1553)
    at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1510)
    at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
    at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179)
    at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:349)
    at java.base/java.util.ArrayList.writeObject(ArrayList.java:897)
    at java.base/jdk.internal.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
Exception in thread "main" java.lang.StackOverflowError
    at java.base/java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:3169)
    at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1847)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2169)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679)
    at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2464)
    at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2358)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2196)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:493)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:451)
    at java.base/java.util.ArrayList.readObject(ArrayList.java:929)
    at java.base/jdk.internal.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)