【发布时间】:2013-09-11 09:37:13
【问题描述】:
我们知道静态字段是不可序列化的,
但是我们类中的serialversionUID是final和static的,就算是static又是final怎么序列化的
【问题讨论】:
标签: java serialization core
我们知道静态字段是不可序列化的,
但是我们类中的serialversionUID是final和static的,就算是static又是final怎么序列化的
【问题讨论】:
标签: java serialization core
在序列化过程中,写入的内容之一是类描述符。此类描述符包含类的名称和 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());
}
}
}
【讨论】:
它没有按照您的意思进行序列化。它在第一次序列化类的实例时作为类信息的一部分传输。这不是一回事。
【讨论】:
serialVersionUID 是一个静态字段,不与对象一起传输。但是serialVersionUID是跟class一起传输的,class是受handle机制的约束的,也就是说每个stream只传输一次。
【讨论】: