有没有办法确定序列化的Java对象生成的serialVersionUID
?
问题是我在没有明确指定serialVersionUID
的情况下序列化了对象。现在,反序列化过程抱怨类不兼容。然而,我没有以一种会使其不兼容的方式更改类。因此,我假设在类中指定serialVersionUID
就足够了,因为它存储在对象数据中。为此,我需要从序列化数据中读取serialVersionUID
。
发布于 2009-08-24 12:46:58
您可以通过扩展ObjectInputStream来完成此操作
public class PrintUIDs extends ObjectInputStream {
public PrintUIDs(InputStream in) throws IOException {
super(in);
}
@Override
protected ObjectStreamClass readClassDescriptor() throws IOException,
ClassNotFoundException {
ObjectStreamClass descriptor = super.readClassDescriptor();
System.out.println("name=" + descriptor.getName());
System.out.println("serialVersionUID=" + descriptor.getSerialVersionUID());
return descriptor;
}
public static void main(String[] args) throws IOException,
ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
List<Object> list = Arrays.asList((Object) new Date(), UUID.randomUUID());
oos.writeObject(list);
oos.close();
InputStream in = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new PrintUIDs(in);
ois.readObject();
}
}
我相信可以通过替换该方法返回的描述符来读取所有序列化的数据,但我还没有尝试过。
发布于 2014-11-09 06:15:18
这对我来说很有效:
long serialVersionUID = ObjectStreamClass.lookup(YourObject.getClass()).getSerialVersionUID();
希望这对你也有帮助。
发布于 2009-08-24 13:14:36
有一个简单的方法来找出一个类的serialversionUID -
假设你有一个类,在这个类中你忘记提到serialversionUID-
import java.io.Serializable;
public class TestSerializable implements Serializable {
}
就这么做吧-
serialver -classpath . TestSerializable
这个打印出来-
static final long serialVersionUID = 5832063776451490808L;
serialver是JDK附带的一个实用程序
https://stackoverflow.com/questions/1321988
复制相似问题