java 序列化 class,java-序列化的Class数据到底是什么?

我一直想知道您是否在这样的对象中序列化类数据:

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,则可以认为它是由于反序列化而不是直接引用引起的.

它确实:

qSj4K.png

所以是的,尝试获取诸如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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值