我想跨不同的應用程序共享Java對象。使用不同的軟件包名稱在不同的應用程序中解析/序列化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。
這些問題可能會有所幫助:http://stackoverflow.com/a/13262989/446554和http://stackoverflow.com/a/13263036/446554 – 2014-09-30 16:20:15
我的問題是:爲什麼覆蓋「readClassDescriptor」方法無法解決所描述的問題。那就是:原來的類不再可用於原始名稱下的jvm ... – matthiasboesinger 2014-09-30 16:28:59