Jakarta ee 在类装入器之间复制对象

Jakarta ee 在类装入器之间复制对象,jakarta-ee,classloader,Jakarta Ee,Classloader,我的任务是将对象从ClassLoaderB的ClassB复制到ClassLoaderA的ClassAClassLoaderA是ClassLoaderB的子级 我尝试使用序列化并保存了类ClassB ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream( baos ); oos.writeObject( ClassB ); 下一步是将该对象

我的任务是将对象从
ClassLoaderB
ClassB
复制到
ClassLoaderA
ClassA
ClassLoaderA
ClassLoaderB
的子级

我尝试使用序列化并保存了类
ClassB

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream( baos );
oos.writeObject( ClassB );
下一步是将该对象读入
ClassLoaderA
ClassA
。我该怎么做

UPD:

以下是对象反序列化的方式:

    //Resurrection
    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray() );
    ObjectInputStream ois = new ObjectInputStream( bais );
    try {
        Object b1 = ois.readObject();
        ois.close();
        ClassA a1 = (ClassA) b1;

    } catch (Exception e) {
        e.printStackTrace();
    }   
问题是第行中有一个ClassCastException:

ClassA a1 = (ClassA) b1;

我认为最简单的方法是从类装入器A公开一个RMI方法,然后从类装入器B调用它,将对象作为参数传递

如果要读取序列化文件,请执行以下操作:

package com.mkyong.io;

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;

public class Deserializer{

   public static void main (String args[]) {

       Deserializer deserializer = new Deserializer();
       Address address = deserializer.deserialzeAddress();
       System.out.println(address);
   }

   public Address deserialzeAddress(){

       Address address;

       try{

           FileInputStream fin = new FileInputStream("c:\\address.ser");
           ObjectInputStream ois = new ObjectInputStream(fin);
           address = (Address) ois.readObject();
           ois.close();

           return address;

       }catch(Exception ex){
           ex.printStackTrace();
           return null;
       } 
   } 
} 
代码取自:


更新


只有当ClassB扩展ClassA时,才能将对象ClassB上的变量复制到ClassA中,否则会出现编译错误或ClassCastException:

public class ClassB extends ClassA{

   ...

}
这是因为序列化文件不仅包含数据,而且还包含有关已序列化类的信息


我想你是以前的C/C++程序员,因为在这些语言中你没有错误。< /P> OK,是的,我尝试过反序列化,但是结果发现对象(<代码>地址> <代码>在该示例中)成为父类Load Load B中的一个。我可能需要反思什么的我不明白你的意思。您可以发布用于序列化和反序列化的类的代码吗?@DaniilLuzin您可以创建由ClassA和ClassB实现的接口InterfaceC,然后您可以编写:

InterfaceC i=(InterfaceC)ois.readObject()只有当ClassB扩展ClassA时,才能将对象ClassB上的变量复制到ClassA中,否则会出现编译错误或ClassCastException。