为什么java中的String不会覆盖readObject?

时间:2015-08-25 18:09:36

标签: java serialization immutability

我正在研究有效的java和In immutability(第15项),它被写成: 在构造函数,访问器和 readObject 方法(第76项)中制作防御性副本(第39项)。

在第76项中建议覆盖readObject并通过破坏最终关键字来创建可变对象的防御性副本。所以我检查了java中的String类,并检查它们是否对final char value[];做了相同的操作,但是没有覆盖readObject。

我对此感到困惑?请回答。

1 个答案:

答案 0 :(得分:2)

字符串,数组和枚举是序列化中的特殊情况,并且不像其他对象那样通过readObject / writeObject序列化。

以下是http://dotween.demigiant.com/documentation.php的评论:

   /**
    * Class String is special cased within the Serialization Stream Protocol.
    *
    * A String instance is written initially into an ObjectOutputStream in the
    * following format:
    * <pre>
    *      <code>TC_STRING</code> (utf String)
    * </pre>
    * The String is written by method <code>DataOutput.writeUTF</code>.
    * A new handle is generated to  refer to all future references to the
    * string instance within the stream.
    */

以下是String.java的特殊情况:

// remaining cases
if (obj instanceof String) {
    writeString((String) obj, unshared);
} else if (cl.isArray()) {
    writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
    writeEnum((Enum) obj, desc, unshared);
} else if (obj instanceof Serializable) {
    writeOrdinaryObject(obj, desc, unshared);
} else {
    if (extendedDebugInfo) {
        throw new NotSerializableException(
            cl.getName() + "\n" + debugInfoStack.toString());
    } else {
        throw new NotSerializableException(cl.getName());
    }
}