Поскольку мы знаем, что статические поля не сериализуемы,
но serialversionUID в нашем классе окончательный и статичный. Как он сериализуется, даже если он статичный и окончательный
Поскольку мы знаем, что статические поля не сериализуемы,
но serialversionUID в нашем классе окончательный и статичный. Как он сериализуется, даже если он статичный и окончательный
В процессе сериализации одна из вещей, которая записывается, — это дескриптор класса. Этот дескриптор класса содержит имя и 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
передается с классом, и этот класс подчиняется механизму дескриптора, что означает, что он передается только один раз для каждого потока.