Java在不知道类的情况下反序列化,但知道接口

时间:2015-07-10 08:11:58

标签: java serialization plugins deserialization classnotfoundexception

我有一个带有类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;}

如果我能用另一个序列化/反序列化函数来实现它,那么就告诉我哪一个。 谢谢, 杰夫

0 个答案:

没有答案