Вот мой код Java:
FileOutputStream fos = null;
ObjectOutputStream out = null;
try {
fos = new FileOutputStream(pathName);
out = new ObjectOutputStream(fos);
out.writeObject(index);
out.close();
fos.close();
} catch (IOException e) {
LogManager.writeLogToFile(e.getMessage());
e.printStackTrace();
}
Индекс является экземпляром перевернутого индекса документа самостоятельно. Я построил индекс объекта в памяти, но когда я передаю его методу writeObject (index), я получаю ошибку StackOverflowError. У меня вопрос: почему эта ошибка возникает после того, как я построил объект в памяти?
Предположим, что структура данных индекса следующая:
class InvertedIndex{
private HashMap<String, PostList> index;
}
class PostList{
private int size;
private PostNode first;
}
class PostNode{
private String key;
private double weight;
private PostNode next;
}
Чтобы избежать рекурсивного вызова, я перезаписываю методы writeObject и readObject из PostList, потому что это может быть очень длинный список:
class PostList{
private void writeObject(ObjectOutputStream out) throws IOException{
PostNode temp = first;
while(temp != null){
out.writeObject(temp);
temp = temp.getNext();
}
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
in.defaultReadObject();
}
}
Тогда я получу два вопроса:
- out.writeObject (температура); Поскольку у temp есть ссылка на следующий узел, когда я пишу temp, также произойдет рекурсивный вызов. Та же ситуация будет продолжаться, даже если я перезапишу метод writeObject объекта PostNode с параметром defaultWriteObject. Я прав? Если так, что я могу сделать, чтобы избежать этого рекурсивного вызова?
- Как переписать метод readObject ()?