【发布时间】:2014-11-25 08:26:29
【问题描述】:
我想在不同的应用程序之间共享 java 对象。
只要我在不同的项目中使用相同的包名,它就可以正常工作。 但是,如果我更改包名称,它就不再起作用了。
我尝试通过扩展 ObjectInputStream 类并覆盖 readClassDescriptor 方法来解决此问题。
但是这样做我得到以下错误:
java.io.StreamCorruptedException: invalid type code: 00
...不知道如何解决这个问题。
这是我用于扩展 ObjectInputStream 类的代码:
public class MyObjectInputStream extends ObjectInputStream {
public static Map<String, Class> classNameMapping = initclassNameMapping();
private static Map<String, Class> initclassNameMapping(){
Map<String, Class> res = new HashMap<String, Class>();
//ipxTest is the name of the package where the objects got serialized
res.put("ipxTest.IPX", interprojectxchangeTest.IPX.class);
res.put("ipxTest.A", interprojectxchangeTest.A.class);
return Collections.unmodifiableMap(res);
}
public MyObjectInputStream(InputStream in) throws IOException {
super(in);
enableResolveObject(true);
}
protected MyObjectInputStream() throws IOException, SecurityException {
super();
enableResolveObject(true);
}
@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;
}
}
IPX 和 A 类在不同的项目中看起来相同,并且都具有相同的 serialID。
【问题讨论】:
-
我的问题是:为什么覆盖的'readClassDescriptor'方法不能解决所描述的问题。也就是说:jvm 无法再以其原始名称访问原始类...
标签: java serializable