我一直想知道您是否在这样的对象中序列化类数据:
public Something implements Serializable{
private static final long serialVersionUID = 1L;
public Class type;
}
实际将哪些数据序列化并保存为类型?
即使您当时未加载该类,是否也可以从类型中获取诸如simplename和fullname之类的信息?
解决方法:
Is it possible to get info like simplename and fullname from type even if you don’t have that class loaded at the time?
只要存在该类型的类,就会加载Class对象所引用的类.
使用下面的代码:
class Test implements Serializable {
// verion UID
public Class type;
public Test(Class type) {
this.type = type;
}
}
我序列化了一个包含不同类型的Class的Test对象:
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("text.obj"));
out.writeObject(new Test(Second.class));
out.close();
现在,将其读回:
ObjectInputStream in = new ObjectInputStream(new FileInputStream("text.obj"));
Test test = (Test) in.readObject();
in.close();
在此代码中没有引用第二类.如果在运行上述程序时加载了Second,则可以认为它是由于反序列化而不是直接引用引起的.
它确实:
所以是的,尝试获取诸如type.getSimpleName()之类的东西将起作用.
运行:
ObjectInputStream in = new ObjectInputStream(new FileInputStream("text.obj"));
Test test = (Test) in.readObject();
System.out.println(test.type.getSimpleName());
in.close();
版画
Second
删除第二个类时,将按预期方式获得ClassNotFoundException.通过阅读stacktrace,您可以看到程序尝试加载Second类:
Exception in thread "main" java.lang.ClassNotFoundException: test.Second
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at java.io.ObjectInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readClass(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
标签:serialization,java,class
来源: https://codeday.me/bug/20191111/2018375.html