#java #serialization
#java #сериализация
Вопрос:
В действующей второй версии Java в качестве плохого примера использования сериализованной формы по умолчанию приведен этот класс:
// Awful candidate for default serialized form
public final class StringList implements Serializable {
private int size = 0;
private Entry head = null;
private static class Entry implements Serializable {
String data;
Entry next;
Entry previous;
}
... // Remainder omitted
}
Указанная причина заключается в том, что «сериализованная форма по умолчанию будет тщательно отражать каждую запись в связанном списке
и все ссылки между записями в обоих направлениях». И далее говорится, что мы должны просто сериализовать этот класс как массив строк.
В руководстве по Java EE 6 есть еще один пример — приложение order. В нем есть класс Part
, который также использует сериализованную форму по умолчанию и выглядит следующим образом:
public class Part implements java.io.Serializable {
private static final long serialVersionUID = -3082087016342644227L;
private Date revisionDate;
private List<Part> parts;
private Part bomPart;
private Serializable drawing;
private String description;
private String partNumber;
private String specification;
private VendorPart vendorPart;
private int revision;
...
}
Поскольку a Part
содержит a List
из Part
s, разве у нас не та же проблема? Сериализованная форма по умолчанию будет рекурсивно сериализовать каждый Part
объект, содержащийся в другом Part
объекте.
Комментарии:
1. Только если вы создаете круг, где часть
A
содержит список, содержащий частьB
, иB
содержит список, содержащийA
.2. Дело в
LinkedList
том, что создать aLinkedList
из массива очень дешево. И сериализация Java сильно оптимизирована для массивов. В вашем втором примере информация теряется . Невозможно восстановить отношения, если вы их не сохраните.3. @Smutje это нонсенс. Java serialization API с радостью сериализует циклические ссылки. Было бы совершенно бесполезно, если бы это было не так.
4. Если это проблема, то используйте
Externalizable
. Подождите, пока это не станет проблемой, преждевременная оптимизация — корень всего зла — Кнут.