あなたは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();
}
}
を私はメソッドから返された記述子を交換することにより、すべてのシリアル化されたデータを読み取ることが可能であろうと信じて、私はそれを試していません。
メソッドがクラスに追加された場合はどうなりますか?変更されたシリアライズされたクラスを使用して古いシリアル化オブジェクトを読み取ることはできますか? – sprezzatura
メソッドはオブジェクトの状態を構成しないため、serialVersionUIDを使用していない限り、シリアル化されたオブジェクトを読み取る際には問題ありません。 –