serialversionuid является статическим и окончательным, но тогда почему он сериализуем?

Поскольку мы знаем, что статические поля не сериализуемы,

но serialversionUID в нашем классе окончательный и статичный. Как он сериализуется, даже если он статичный и окончательный


person dexterousashish    schedule 11.09.2013    source источник


Ответы (3)


В процессе сериализации одна из вещей, которая записывается, — это дескриптор класса. Этот дескриптор класса содержит имя и serialVersionUID класса.

Этот метод можно найти в классе java.io.ObjectStreamClass(http://docs.oracle.com/javase/7/docs/api/java/io/ObjectStreamClass.html)

/**
 * Writes non-proxy class descriptor information to given output stream.
 */
void writeNonProxy(ObjectOutputStream out) throws IOException {
    out.writeUTF(name);
    out.writeLong(getSerialVersionUID());

    byte flags = 0;
    if (externalizable) {
        flags |= ObjectStreamConstants.SC_EXTERNALIZABLE;
        int protocol = out.getProtocolVersion();
        if (protocol != ObjectStreamConstants.PROTOCOL_VERSION_1) {
            flags |= ObjectStreamConstants.SC_BLOCK_DATA;
        }
    } else if (serializable) {
        flags |= ObjectStreamConstants.SC_SERIALIZABLE;
    }
    if (hasWriteObjectData) {
        flags |= ObjectStreamConstants.SC_WRITE_METHOD;
    }
    if (isEnum) {
        flags |= ObjectStreamConstants.SC_ENUM;
    }
    out.writeByte(flags);

    out.writeShort(fields.length);
    for (int i = 0; i < fields.length; i++) {
        ObjectStreamField f = fields[i];
        out.writeByte(f.getTypeCode());
         out.writeUTF(f.getName());
        if (!f.isPrimitive()) {
            out.writeTypeString(f.getTypeString());
        }
    }
}
person stefaan dutry    schedule 11.09.2013

Он не сериализован так, как вы имеете в виду. Он передается как часть информации о классе при первой сериализации экземпляра класса. Это не то же самое.

person user207421    schedule 11.09.2013
comment
Я хотел бы узнать больше об этом. не могли бы вы предоставить ссылки? - person Prasad Kharkar; 11.09.2013

serialVersionUID является статическим полем и не передается вместе с объектом. Но serialVersionUID передается с классом, и этот класс подчиняется механизму дескриптора, что означает, что он передается только один раз для каждого потока.

person Juned Ahsan    schedule 11.09.2013
comment
Нельзя цитировать ненормативные ссылки. Это просто еще одна веб-страница, хотя и менее авторитетная, чем эта. Из Спецификации сериализации объектов совершенно ясно, что serialVersionUID передается не с объектом вообще, а с классом, и что класс подчиняется механизму дескриптора, что означает, что он только передается один раз за поток. - person user207421; 11.09.2013
comment
@EJP Я согласен, что использование неофициальных ссылок на Java - не очень хорошая идея. Я обнаружил, что упомянутая там информация верна, поэтому упомянул ее для дальнейшего чтения. - person Juned Ahsan; 11.09.2013
comment
Это неправильно. Даже если бы это было так, это все равно ненормативная ссылка, и ее не следует цитировать. - person user207421; 11.09.2013
comment
Теперь вы удалили цитату, но не скопированную из нее ошибку. Ваш ответ остается неверным. - person user207421; 11.09.2013
comment
И более 50% его сейчас состоит из непризнанного плагиата из моего ответа и комментариев. - person user207421; 11.09.2013
comment
@EJP да, я пытался следить за вашими комментариями и включил их в свой ответ. Спасибо! - person Juned Ahsan; 11.09.2013