gpt4 book ai didi

更改类的包名后,Java 对象将无法反序列化。我能做什么呢?

转载 作者:行者123 更新时间:2023-12-02 01:53:23 34 4
gpt4 key购买 nike

众所周知,当我反序列化一个序列化的 Java 对象树时,树中的所有类都必须位于类路径上。因此,由于有人将一些类移动到另一个包中,反序列化会抛出 ClassNotFoundException。

我的问题是,有没有比实现我自己的序列化/反序列化更简单的方法来解决这个问题?

最佳答案

好的,我意识到这个问题可能是重复的。 Stephen's answer to a previous post对我来说很好用,我可以反序列化那些移动到其他包的类。作为记录,我在这里放置了我使用的 ObjectInputStream 的子类。

public class ClassNameMappingObjectInputStream extends ObjectInputStream {

public static Map<String, Class> classNameMapping = initclassNameMapping();

private static Map<String, Class> initclassNameMapping(){
Map<String, Class> res = new HashMap<String, Class>();
res.put("com.lsy.nlm.report.filter.Filter", com.lsy.nlm.filter.Filter.class);
res.put("com.lsy.nlm.report.filter.FilterSummary", com.lsy.nlm.filter.FilterSummary.class);
res.put("com.lsy.nlm.report.filter.TopFilter", com.lsy.nlm.filter.TopFilter.class);
return Collections.unmodifiableMap(res);
}

public ClassNameMappingObjectInputStream(InputStream in) throws IOException {
super(in);
}


protected ClassNameMappingObjectInputStream() throws IOException, SecurityException {
super();
}

@Override
protected java.io.ObjectStreamClass readClassDescriptor()
throws IOException, ClassNotFoundException {
ObjectStreamClass desc = super.readClassDescriptor();
if (classNameMapping.containsKey(desc.getName())){
return ObjectStreamClass.lookup(classNameMapping.get(desc.getName()));
}
return desc;
}

}

关于更改类的包名后,Java 对象将无法反序列化。我能做什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10604672/

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