2013-07-10 2 views
3

Всякий раз, когда мы пытаемся создать объект класса, у нас всегда есть уникальное значение для serialVersionId как частного конечного поля, каково его значение по отношению к deserialization, можем ли мы использовать его для проверки того, был ли объект и значения десериализован надлежащим образом?Важность serialVersionId при сериализации?

+0

Oh..sorry..thanks для refrence .. – Ullas

+0

Смотрите также [Как serialVersionUID сериализованная в Java?] (Http://stackoverflow.com/q/13918997/1037210) – Lion

ответ

5

Используется для проверки того, использовалось ли такое же определение класса для сериализации, а также для десериализации. Прямо из documentation

сериализации во время выполнения ассоциирует с каждым сериализуемым классом номер версии, называется serialVersionUID, который используется во время десериализации, чтобы проверить, что отправитель и получатель сериализованного объекта загрузили классы для этого объекта, которые являются совместимый с сериализацией. Если получатель загрузил класс для объекта с другим идентификатором serialVersionUID, чем класс соответствующего класса отправителя, то десериализация приведет к исключению InvalidClassException. Сериализуемый класс может объявить свой собственный serialVersionUID явно, объявив поле с именем «serialVersionUID», которое должно быть статическим, окончательным и длинным:

ANTI-ACCESS-MODIFIER статический конечный длинный serialVersionUID = 42L;

Если сериализуемый класс явно не объявляет serialVersionUID, то среда выполнения сериализации будет вычислять значение serialVersionUID по умолчанию для этого класса на основе различных аспектов класса, как описано в Спецификации сериализации объектов Java (TM). Тем не менее, настоятельно рекомендуется, чтобы все сериализуемые классы явно объявляли значения serialVersionUID, поскольку вычисление по умолчанию serialVersionUID очень чувствительно к деталям класса, которые могут различаться в зависимости от реализаций компилятора и, таким образом, могут приводить к неожиданным InvalidClassExceptions во время десериализации. Поэтому, чтобы гарантировать последовательное значение serialVersionUID в разных реализациях java-компилятора, сериализуемый класс должен объявить явное значение serialVersionUID. Также настоятельно рекомендуется, чтобы явные объявления serialVersionUID использовали, по возможности, частный модификатор, поскольку такие объявления применяются только к полям, объявляющим сразу же: classVersionUID не полезны как унаследованные.

Кроме того, проверить книгу Джоша Блоха Эффективное Java (второе издание):

автоматически сгенерированный UID генерируется на основе имени класса, реализованных интерфейсов, и все государственные и защищенные члены. Изменение любого из них каким-либо образом изменит serialVersionUID. Поэтому вам не нужно возиться с ними, только если вы уверены, что не более чем одна версия класса будет когда-либо сериализована (либо через процессы, либо позже из хранилища).

Если вы проигнорируете их сейчас и найдите позже, что вам нужно каким-то образом изменить класс, но поддерживать совместимость с старой версией класса, вы можете использовать последовательный инструмент JDK для генерации serialVersionUID на старом класса и явно установить это в новом классе. (В зависимости от изменений, которые вы, возможно, потребуется также реализовать пользовательские сериализации путем добавления writeObject и readObject методы - см Serializable Javadoc или вышеупомянутой главы 11.)

+0

upvote, это было информативный :) –

+0

Это почти так же, как ответ Джона Скита: http: // stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use-it –

+0

Если мы создаем пользовательский класс и реализуем Serializable, если мы дадим свой собственный идентификатор. как получатель узнает об этом классе на основе id в какой-либо другой машине? – Ullas

0

Это важно, когда вы сериализации и десериализации тот же класс, используя разные ВМ или по разные машины.UID используется для проверки, если класс, который вы пытаетесь де-сериализовать, действительно тот, который вы так считаете, поэтому, если ваш класс в вашем коде имеет один UID, а класс, который был сериализован, имеет другое, де-сериализация не удастся.

Класс без UID будет предоставлен автоматически JVM, но нет никакой гарантии, что разные JVM предоставят одинаковый UID тому же классу.

Вы также можете обратиться в этом, что я нашел из SO:

What is a serialVersionUID and why should I use it? http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

0

Из ИХ Serializable Object

сериализации во время выполнения ассоциированных с каждым сериализуемым классом а номер версии , называемый serialVersionUID, который используется во время десериализации , чтобы проверить, что отправитель и получатель сериализованногоОбъектимеет загруженные классы для этого объекта, которые совместимы с в отношении сериализации. Если приемник загрузил класс для объекта , у которого есть другой идентификатор serialVersionUID, чем у соответствующего класса отправителя , тогда десериализация приведет к ошибке InvalidClassException. Сериализуемая класс может объявить свой собственный serialVersionUID явно объявить поле с именем «serialVersionUID», который должен быть статическим, окончательными и типа длинного:

ANY-ACCESS модифицирующого статический окончательный длинный serialVersionUID = 42L;

Если сериализации класса не явно объявлять serialVersionUID, то сериализации выполнения будет вычислять значение serialVersionUID по умолчанию для этого класса на основе различных аспектов класса, как описано в (TM) Сериализация объектов Java Технические характеристики. Тем не менее, настоятельно рекомендуется, чтобы все сериализуемые классы явно объявлять serialVersionUID значения, так как по умолчанию serialVersionUID вычисление очень чувствительно к классу деталей, которые могут варьироваться в зависимости от реализации компилятора, и таким образом, может привести к неожиданным InvalidClassExceptions во десериализации. Поэтому, чтобы гарантировать последовательное значение serialVersionUID в разных реализациях java-компилятора, сериализуемый класс должен объявить явное значение serialVersionUID. Также настоятельно рекомендует, чтобы явные объявления serialVersionUID, если это возможно, использовали частный модификатор , так как такие объявления относятся только к , сразу объявляющие поля class - serialVersionUID не являются полезными как унаследованные. Классы массивов не могут объявить явный serialVersionUID, поэтому они всегда имеют рассчитанное по умолчанию значение, но требование для сопоставления значений serialVersionUID отменяется для классов классов .

Существует аналогичная тема. Проверьте here

+0

Это то же самое, что и ответ Джона Скита: http://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use- он –

+2

@ManishDoshi yup позже нашел его и поставил вопрос как дублированный. В любом случае это так же, как документ не тот же поток: p – stinepike

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