我正在研究有效的java和In immutability(第15项),它被写成: 在构造函数,访问器和 readObject 方法(第76项)中制作防御性副本(第39项)。
在第76项中建议覆盖readObject并通过破坏最终关键字来创建可变对象的防御性副本。所以我检查了java中的String类,并检查它们是否对final char value[];
做了相同的操作,但是没有覆盖readObject。
我对此感到困惑?请回答。
答案 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());
}
}