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

标签 java serialization core

众所周知,静态字段是不可序列化的,

但是我们类中的serialversionUID是final和static的,就算是static和final又如何序列化

最佳答案

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

关于java - serialversionuid 是静态的和最终的,但为什么它是可序列化的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18737639/

相关文章:

java - 用java打开文件后会发生什么

java - 在 EC2 上的 Tomcat 上从 JavaEE 项目提供静态文件

c++ - libpqxx 事务序列化和后果

model-view-controller - MVC 核心 - UseIIS 和 UseIISIntegration 有什么区别

java - 无法在 netbeans 上找到文件

json - 使用 Jackson 序列化和反序列化 Lambda

apache-spark - 如何修复 Spark Streaming Kafka Consumer 中的 "java.io.NotSerializableException: org.apache.kafka.clients.consumer.ConsumerRecord"?

linux - 如何制作删除文件的shell脚本

php - 如何更改socialengine4中的核心模块文件

java - 如何在Spring Data中进行Mongo聚合查询?