Подходит ли сериализованная форма по умолчанию в этом случае

#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 том, что создать a LinkedList из массива очень дешево. И сериализация Java сильно оптимизирована для массивов. В вашем втором примере информация теряется . Невозможно восстановить отношения, если вы их не сохраните.

3. @Smutje это нонсенс. Java serialization API с радостью сериализует циклические ссылки. Было бы совершенно бесполезно, если бы это было не так.

4. Если это проблема, то используйте Externalizable . Подождите, пока это не станет проблемой, преждевременная оптимизация — корень всего зла — Кнут.