önlenebilir inanmıyoruz ve sorunu hep bir kez düzeltin.
Yapamazsanız veya bu bir seçenek değilse (örneğin, seri hale getirmeniz gereken bazı nesneleri önceden serileştirdiyseniz), bir çözüm ObjectInputStream
'u uzatmak olacaktır. Akış tanımlayıcısının serialVersionUID
akış tanımlayıcısının sınıfını, bu tanımlayıcının temsil ettiği yerel JVM'deki sınıfın serialVersionUID
ile karşılaştırmasını ve uyumsuzluk durumunda yerel sınıf tanımlayıcısını kullanmasını sağlayın. Ardından, seri hale getirme için bu özel sınıfı kullanın. Böyle bir şey (this message için kredi):
import java.io.IOException;
import java.io.InputStream;
import java.io.InvalidClassException;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DecompressibleInputStream extends ObjectInputStream {
private static Logger logger = LoggerFactory.getLogger(DecompressibleInputStream.class);
public DecompressibleInputStream(InputStream in) throws IOException {
super(in);
}
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
ObjectStreamClass resultClassDescriptor = super.readClassDescriptor(); // initially streams descriptor
Class localClass; // the class in the local JVM that this descriptor represents.
try {
localClass = Class.forName(resultClassDescriptor.getName());
} catch (ClassNotFoundException e) {
logger.error("No local class for " + resultClassDescriptor.getName(), e);
return resultClassDescriptor;
}
ObjectStreamClass localClassDescriptor = ObjectStreamClass.lookup(localClass);
if (localClassDescriptor != null) { // only if class implements serializable
final long localSUID = localClassDescriptor.getSerialVersionUID();
final long streamSUID = resultClassDescriptor.getSerialVersionUID();
if (streamSUID != localSUID) { // check for serialVersionUID mismatch.
final StringBuffer s = new StringBuffer("Overriding serialized class version mismatch: ");
s.append("local serialVersionUID = ").append(localSUID);
s.append(" stream serialVersionUID = ").append(streamSUID);
Exception e = new InvalidClassException(s.toString());
logger.error("Potentially Fatal Deserialization Operation.", e);
resultClassDescriptor = localClassDescriptor; // Use local class descriptor for deserialization
}
}
return resultClassDescriptor;
}
}
Bu kod günlerimi kurtardı! Çok teşekkürler! – peceps
İkinci mesaj bağlantısı bozuk mu? (altı yıl sonra, çok şaşırmadım, akıl) –
Çok teşekkürler. Bu snippet aslında benim için de günü kurtardı. – nserror