gpt4 book ai didi

java - 更改类包时,objectinputstream 的 readObject 方法抛出 ClassNotFoundException

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:15:57 24 4
gpt4 key购买 nike

我使用 ObjectOutputStream 编写计算机中保存对象属性的对象。不幸的是,在特殊情况下更改为类包名称时,我得到 ClassNotFoundException

我的问题中最重要的是:

如何将旧类中的旧属性添加到更改后的类中?

我必须解决问题,因为我需要旧属性来保持我的应用程序正常工作。我确信属性是正确的,只是类名不同。

最佳答案

有一个解决方法:

class Workaround extends ObjectInputStream {
String className;

public Workaround(InputStream in, Class<?> cls) throws IOException {
super(in);
this.className = cls.getName();
}

@Override
protected ObjectStreamClass readClassDescriptor() throws IOException,
ClassNotFoundException {
ObjectStreamClass cd = super.readClassDescriptor();
try {
Field f = cd.getClass().getDeclaredField("name");
f.setAccessible(true);
f.set(cd, className);
} catch (Exception e) {
throw new RuntimeException(e);
}
return cd;
}
}

现在我可以编写一个 Test1 实例并将其作为 Test2 实例读取

class Test1 implements Serializable {
private static final long serialVersionUID = 1L;
int i;
}

class Test2 implements Serializable {
private static final long serialVersionUID = 1L;
int i;
}

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("1"));
Test1 test1 = new Test1();
oos.writeObject(test1);
oos.close();
Workaround x = new Workaround(new FileInputStream("1"), Test2.class);
Test2 test2 = (Test2)x.readObject();

关于java - 更改类包时,objectinputstream 的 readObject 方法抛出 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20462381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com