【问题标题】:serialversionuid is static and final but then why is it serializableserialversionuid 是静态的和最终的,但为什么它是可序列化的
【发布时间】:2013-09-11 09:37:13
【问题描述】:

我们知道静态字段是不可序列化的,

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

【问题讨论】:

    标签: java serialization core


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      它没有按照您的意思进行序列化。它在第一次序列化类的实例时作为类信息的一部分传输。这不是一回事。

      【讨论】:

      【解决方案3】:

      serialVersionUID 是一个静态字段,不与对象一起传输。但是serialVersionUID是跟class一起传输的,class是受handle机制的约束的,也就是说每个stream只传输一次。

      【讨论】:

      • 您不能引用非规范性参考文献。那只是另一个网页,如果有什么比这个少一些权威的话。从对象序列化规范中可以清楚地看出,serialVersionUID 根本不与对象一起传输,而是与 class, 一起传输,并且该类受制于句柄机制,这意味着它只是每个流传输一次。
      • @EJP 我同意使用非官方的 java 引用不是一个好主意。我发现那里提到的信息是正确的,所以提到它以供进一步阅读。
      • 不正确。即使是,它仍然是非规范性参考,不应被引用。
      • 现在您已经删除了引文,但没有删除您从中复制的错误。你的答案仍然不正确。
      • 现在超过 50% 的内容来自我的回答和 cmets 中未被承认的抄袭。
      猜你喜欢
      • 1970-01-01
      • 2011-01-18
      • 2016-11-08
      • 1970-01-01
      • 2010-12-03
      • 2014-05-05
      • 2014-01-24
      • 2011-01-26
      • 2012-05-27
      相关资源
      最近更新 更多