У меня была эта проблема некоторое время назад.Для богато связанных классов, даже если вы можете завершить сериализацию без переполнения стека, сериализация выполняется очень медленно.Когда мы решили эту проблему, у нас было несколько классов, поэтому мы просто создали наш собственный формат сериализации, который упаковал данные в набор целочисленных идентификаторов объектов, с целочисленными идентификаторами полей для каждого поля и описал их соединения через серию идентификаторов объектов., идентификатор поля, сопоставления других идентификаторов объектов.Этот нестандартный подход был очень быстрым и чрезвычайно легким для памяти, но на самом деле работает, только если у вас есть небольшой набор классов, которые вы хотите сериализовать.
Общий случай намного сложнее и потребность в сериализации богато связанных классовне так сильна, поэтому я думаю, поэтому никто не решил это.
В принципе, вы уже столкнулись с проблемой, вам всегда будет нужна глубина стека, равная максимальной высоте дерева поиска в глубину, и поэтому каждый раз, когда ваш график окажется глубже, вы получитепереполнение стека.По сути, это рекурсивная проблема, поэтому вам нужно либо использовать рекурсию, либо фальшивую рекурсию, перемещая выделения стека в объект Stack, который вы помещаете в кучу.Я хотел бы взглянуть на реализацию OpenJDK:
http://hg.openjdk.java.net/jdk6/jdk6-gate/jdk/file/tip/src/share/classes/java/io/ObjectOutputStream.java
У вас уже есть DebugTraceInfoStack, я бы создал второе поле стека для текущего объекта, который вы пишете, и изменил бы метод writeObject0чтобы поместить объект в стек, что-то вроде этого:
stack.push(obj);
while(!stack.empty()) {
obj = stack.pop();
...
Затем вы просто меняете все вызовы на writeObject0 (x);to stack.push (x) ;.Простое стандартное преобразование между рекурсией и итерацией, за исключением того, что класс почти 2500 строк и, вероятно, есть тонны ошибок.
Если вы в конечном итоге создадите его, я бы рекомендовал представить в качестве исправления для следующей версии Java, как это было бы полезно, что-то вроде IterativeObjectOutputStream для использования в графах глубоких объектов.