Является ли сериализуемый DirectedSparseGraph от JUNG? - PullRequest
2 голосов
/ 28 марта 2012

Поскольку DirectedSparseGraph реализует сериализуемый ( javadoc ), почему я не могу создать граф, сериализовать его в файл, а затем десериализовать? InvalidClassException генерируется при вызове deserializer.readObject () с сообщением «нет допустимого конструктора».

Глядя на javadoc и исходные файлы, он имеет конструктор с нулевым аргументом.

Это ошибка в библиотеке? Или я что-то упустил? Какой тип конструктора ожидает Java?

    DirectedSparseGraph graph = new DirectedSparseGraph();

    FileOutputStream underlyingStream = new FileOutputStream("output/temp.jung");
    ObjectOutputStream serializer = new ObjectOutputStream(underlyingStream);
    serializer.writeObject(graph);
    serializer.close();
    underlyingStream.close();   

    FileInputStream underlyingStream2 = new FileInputStream( "output/temp.jung" ); 
    ObjectInputStream deserializer = new ObjectInputStream( underlyingStream2 );
    DirectedSparseGraph loadedGraph = (DirectedSparseGraph) deserializer.readObject(); //EXCEPTION THROWN HERE
    deserializer.close();
    underlyingStream2.close();

Исключение:

Exception in thread "main" java.io.InvalidClassException: edu.uci.ics.jung.graph.DirectedSparseGraph; edu.uci.ics.jung.graph.DirectedSparseGraph; no valid constructor
at java.io.ObjectStreamClass.checkDeserialize(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at gui.GraphViewer.main(GraphViewer.java:39)
Caused by: java.io.InvalidClassException: edu.uci.ics.jung.graph.DirectedSparseGraph; no valid constructor
at java.io.ObjectStreamClass.<init>(Unknown Source)
at java.io.ObjectStreamClass.lookup(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at gui.GraphViewer.main(GraphViewer.java:33)

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Единственное требование к конструктору для класса, который реализует Сериализуемым является то, что первый несериализуемый суперкласс в своем иерархия наследования должна иметь конструктор без аргументов

Источник: http://www.jguru.com/faq/view.jsp?EID=251942

Во время десериализации поля несериализуемых классов будут инициализируется с использованием открытого или защищенного конструктора без аргументов учебный класс. Конструктор без аргументов должен быть доступен для подкласса сериализации. Поля сериализуемых подклассов будут восстановлены из ручья.

Источник: http://docs.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html

0 голосов
/ 19 апреля 2013

Я сериализую DirectedSparseGraph, используя библиотеку XStream . Вы сериализуете и десериализуете объекты с 2 строками кода, , даже если объекты не реализуют Сериализуемый . Так что это особенно полезно при сериализации сторонних объектов, которые нельзя изменить, чтобы сделать их сериализуемыми.

Как только вы попробуете это, вы никогда не вернетесь к нативной сериализации Java. Единственная проблема заключается в том, что XStream сериализуется в XML, поэтому, если у вас есть строгие требования к производительности, это не лучший выбор.

...