2014-10-26 2 views
3

У меня есть класс, а сериализацииПочему имя метода считается или генерации хэш serialversionuid

public class Name implements Serializable { 
    private final String firstName; 
    private final String lastName; 

    public Name(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 
} 

Но пока десериализацией у меня есть дополнительный метод (упомянутый ниже), не затрагивающей состояние объекта в любом случае и сериализация - это все о сохранении состояния объекта, а затем почему дополнительный метод имеет вклад в генерацию хэша для serialversionuid. В текущем сценарии он завершится с InvalidClassException. Но состояние объекта не изменяется с помощью этого дополнительного метода.

public String getFullName() { 
    return firstName + " " + lastName; 
} 
+0

Хороший вопрос, но это как раз то, как это, к сожалению. Мне показалось даже в 1997 году, что в то время это не было продумано достаточно. Решение как всегда состоит в том, чтобы предоставить свой собственный 'serialVersionUID.' – EJP

+0

Спасибо EJB, кажется, что это было сделано не намеренно, я не могу найти никакого значения этого. – user1678270

ответ

2

По умолчанию необходимо убедиться, что ваши сериализованные объекты совместимы только в том случае, если они получены из одного и того же класса. Для этого учитывается ряд атрибутов класса: https://docs.oracle.com/javase/6/docs/platform/serialization/spec/class.html#4100

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

0

Согласно documentation

Для каждой незакрытой методы отсортированного по имени метода и подпись:

The name of the method. 
The modifiers of the method written as a 32-bit integer. 
The descriptor of the method. 

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

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