Akka - StackOverflowError во время сериализации объекта

У меня проблема, которая длится более 2 дней. Когда я обмениваюсь сообщениями между актерами, я обвиняю переполнение стека JVM.

Мое сообщение представляет собой объект со множеством ссылок (более 10000 дочерних объектов, связанных вместе в связанном списке). А именно, объект с отношениями Neo4J.

Ошибка такова:

java.lang.StackOverflowError
    at java.io.Bits.putLong(Bits.java:108)
    at java.io.ObjectOutputStream$BlockDataOutputStream.writeLong(ObjectOutputStream.java:1928)
    at java.io.ObjectOutputStream.writeLong(ObjectOutputStream.java:788)
    at java.util.Date.writeObject(Date.java:1303)
    at sun.reflect.GeneratedMethodAccessor41.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)

У кого-нибудь есть решение для этого?

Спасибо


person ricardogobbo    schedule 20.06.2011    source источник
comment
Возможно, вам следует добавить теги neo4j и java, чтобы привлечь внимание большего количества людей...   -  person Christian    schedule 21.06.2011
comment
@Кристиан, спасибо, я сделаю это   -  person ricardogobbo    schedule 21.06.2011
comment
Не могли бы вы подробнее рассказать о своей структуре данных? IMHO Neo4j-Relationships не сериализуемы, поскольку они являются живыми объектами, подключенными к базе данных графа? Вы можете просто сохранить их идентификаторы, но тогда хранилище графов на другом конце должно быть точно синхронизировано с исходным.   -  person Michael Hunger    schedule 22.06.2011
comment
Похоже, эта проблема распространена! Обратите внимание на bugs.sun.com/view_bug.do?bug_id=4152790.   -  person ricardogobbo    schedule 22.06.2011
comment
@Michael_Hunger: я на самом деле абстрагирую отношения между данными из Neo4J. Я использую концепцию Transfer Objects (TO). В этих объектах я создаю циклические зависимости между собой. Но проблема не в этих циклических зависимостях. Кажется, что влияет глубина отношений, потому что некоторые из них действуют как связанные списки.   -  person ricardogobbo    schedule 22.06.2011


Ответы (2)


Вы используете java.util.LinkedList или собственный связанный список? Если последнее, вам нужно написать для него собственный метод writeObject(), который позволяет избежать рекурсии, которая произошла бы, если бы у вас его не было.

person user207421    schedule 20.06.2011
comment
Я не реализую никакой структуры данных. Я использую только коллекции scala. - person ricardogobbo; 21.06.2011
comment
@ricardogobbo Итак, вам нужно просмотреть трассировку стека, чтобы увидеть, какие классы участвуют в этой очевидной рекурсии, и опубликовать эту информацию здесь. - person user207421; 22.06.2011
comment
Я считаю, что это решение. Я понял, что есть ссылки, которые напоминают LinkedList. Другими словами, я понял, что вы сказали xD. Теперь тестирование! - person ricardogobbo; 22.06.2011

Вероятным кандидатом на проблему является объект, который имеет ссылку на себя. Учитывая ваше выражение домена, я подозреваю, что у ребенка есть связанный список, который включает себя или циклическую ссылку. То есть один из узлов, к которому он привязан, в свою очередь имеет ссылку на него.

person oxbow_lakes    schedule 20.06.2011
comment
Привет, так не бывает, я много пересмотрел, прежде чем опубликовать свой вопрос. Объект связан друг с другом как след точек с географической привязкой от предыдущей точки и следующей точки. У первой точки нет предыдущей точки, а у последней точки нет следующей точки. - person ricardogobbo; 21.06.2011
comment
Этот ответ неверен. Циклические графы объектов специально обрабатываются Сериализацией. В частности, они не вызывают рекурсии. - person user207421; 21.06.2011
comment
Так в чем же проблема, зная, что рекурсии между объектами по-прежнему нет? - person ricardogobbo; 21.06.2011
comment
@ricardo видишь мой ответ? Нет особого смысла добавлять свои комментарии и вопросы к неправильному ответу. - person user207421; 21.06.2011