2012-07-04 3 views
1

При реализации интерфейса Serializable в Java нам нужно установить его длиной serialVersionUID.На Java Serializable необходимо уточнение

Существуют ли какие-либо отличия от того, выбраны ли по умолчанию или автоматически сгенерированы?

Когда следует отдать предпочтение другому?

Если выбрано авто сгенерированное длинное, следует ли его изменить в классе событий, если он изменен? Другими словами, значение, которое присваивается serialVersionUID .. связано с текущей структурой класса и полей и методов, которые там объявлены?

private static final long serialVersionUID = 1L; 
private static final long serialVersionUID = 6749067740891125834L; 
+0

Возможный дубликат [Что такое serialVersionUID и зачем его использовать?] (Http://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use- это) – paulsm4

+0

Возможный дубликат [Зачем генерировать длинный serialVersionUID вместо простого 1L?] (http://stackoverflow.com/questions/888335/why-generate-long-serialversionuid-instead-of-a-simple-1l) – Thilo

+0

Два недостатка использования серийного ID по умолчанию: 1) Он зависит от компилятора и версии. Автоматический номер может случайно «ломаться», если вы попытаетесь десериализоваться в разных средах. 2) Вы получаете эти раздражающие предупреждения :) Просто используйте «1L» и fugghedabouddit;) – paulsm4

ответ

1

UID может быть любым числом, его значение не имеет конкретного значения.

Это имеет смысл и удобно начинать с 1 и увеличивать его каждый раз, когда формат изменяется.

Вы можете сделать это, однако, если подумать об этом с самого начала. Если у вас уже есть существующие данные, которые нужно продолжать читать, эти данные будут иметь автоматически сгенерированный идентификатор. В этом случае у вас нет выбора, но для соответствия этому значению.

+0

Не имеет никакого смысла вообще его менять. Все это делает разрыв всех существующих сериализации. Вместо этого вы должны перегибать назад, чтобы поддерживать их совместимость в соответствии с правилами Версии объектов, путем написания методов сериализации customt, serialFields и т. Д. – EJP

2

Основное различие между по умолчанию и автоматически сгенерированным длинным состоит в том, что автоматически сгенерированный идентификатор последовательной версии основан на полях объекта. Если вы сохранили копии объекта, у которого нет идентификатора версии, то использование сгенерированной версии может помочь обеспечить совместимость с объектами, которые уже сохранены. Из-за этого я склонен использовать сгенерированные версии. В любом случае вам необходимо обновить идентификатор версии, если сделаны несовместимые изменения.

http://docs.oracle.com/javase/1.5.0/docs/guide/serialization/spec/version.html разделы 5.6.1 и 5.6.2 описывают, какие изменения совместимы и какие изменения нарушат сериализацию.

Смежные вопросы