gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:05:53 25 4
gpt4 key购买 nike

我正在研究 effective java,在 immutability(Item 15) 中写道:在构造函数、访问器和 readObject 方法(第 76 项)中制作防御性副本(第 39 项)。

并且在项目 76 中,建议覆盖 readObject 并通过妥协 final 关键字创建可变对象的防御副本。所以我检查了 Java 中的 String 类,并检查它们是否对 final char value[]; 做了同样的事情,但是 readObject 没有被覆盖。

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

最佳答案

字符串、数组和枚举是序列化的特例,不像其他对象那样通过 readObject/writeObject 进行序列化。

这是来自 String.java 的评论:

   /**
* 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.
*/

这里是来自 ObjectOutputStream.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());
}
}

关于java - 为什么java中的String不覆盖readObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32211113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com