我有一个带有类UserObjects的插件1,它实现了ISharedObjects和Serializable,它属于插件2。
现在,我的插件2是一个在客户端之间同步数据的框架。在插件2中,我有一个公共方法setSharedObjects(ISharedObjects对象)。之后,我将plugin2中的数据序列化并将其发送给其他客户端,这些客户端也会在插件2中接收它并对其进行反序列化。
现在从我的设计来看,框架(插件2)应该是通用的,并且不知道ISharedObject的所有实现,其他插件可以使用。 所以我在插件1中调用setSharedObjects(UserObjects objects = new UserObjects())。 它被正确序列化,并被传输到其他客户端。但是当他们尝试反序列化它时,它们会得到ClassNotFoundException,因为它们的插件2(框架)不知道类UserObjects,它位于插件1中。 我不能简单地将字符串传递给插件1并在那里反序列化,因为它会破坏我的整个概念。我也不能简单地在插件2中导入插件1,因为我会得到循环错误,而且我的框架应该是通用的,没有任何有关user-plugin的信息(本例中为插件1)
还有可能继续这项工作吗?我想到了两个可能的选项,但是不能选择1运行,并没有选项2的确切线索。 选项1:我的插件2定义了一个SharedObject类,UserObjects扩展了SharedObject。然后,为了传输,我将所有内容都转换为SharedObject并对其进行反序列化。
第二个选项:在序列化期间,我将UserObjects的类加载器路径存储在我的序列化数据中,在反序列化期间,我检索此路径并且它有效。但是对于这个解决方案,我还没有找到,我如何具体实现它,并且会感谢任何线索。
目前我使用此序列化功能:
public String serializeObjectToString(Object object) {
String encoded=null;
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream ;
try {
objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(object);
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
encoded = new String(Base64.encodeBase64(byteArrayOutputStream.toByteArray()));
return encoded;
}
public static Object deserializeObjectFromString(String objectString) throws IOException, ClassNotFoundException {
byte[] bytes = Base64.decodeBase64(objectString.getBytes());
Object object = null;
try {
ObjectInputStream objectInputStream = new ObjectInputStream( new ByteArrayInputStream(bytes) );
object = objectInputStream.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (ClassCastException e) {
e.printStackTrace();
}
return object;}
如果我能用另一个序列化/反序列化函数来实现它,那么就告诉我哪一个。 谢谢, 杰夫