serialversionuid是静态的和最终的,但为什么它是可序列化的

由于我们知道静态字段不可序列化,

但是我们类中的serialversionUID是final和static的,即使它是静态的也是最终的,它是如何序列化的


在序列化过程中,写入的内容之一是类描述符。 这个类描述符包含类的名称和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());
        }
    }
}

它没有按照你的意思序列化。 当类第一次被序列化时,它作为类信息的一部分被传送。 这不是一回事。


serialVersionUID是一个静态字段,不与对象一起传输。 但serialVersionUID与类一起传输,并且该类受制于句柄机制,这意味着它仅在每个流中传输一次。

链接地址: http://www.djcxy.com/p/23865.html

上一篇: serialversionuid is static and final but then why is it serializable

下一篇: serialVersionUID for serizlizable class