2013-07-24 3 views
0

Моя задача состоит в том, чтобы копировать объекты из ClassB из ClassLoaderB в ClassA в ClassLoaderA. ClassLoaderA является ребенком ClassLoaderB.Копирование объектов между загрузчиков классов

Я пытался использовать сериализацию и сохранили класс ClassB

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(baos); 
oos.writeObject(ClassB); 

Следующий шаг будет читать этот объект в ClassA из ClassLoaderA. Как я могу это сделать?

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; 
+0

Вы можете скопировать объект ClassB в переменную ClassA только в том случае, если ClassB расширяет ClassA, иначе вы будете иметь ошибки компиляции или ClassCastExceptions. –

ответ

0

Я считаю, что самый простой путь заключается в том, чтобы выставить метод RMI из загрузчика классов A, а затем вызвать его из загрузчика классов 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; 
     } 
    } 
} 

Код был взят из: http://www.mkyong.com/java/how-to-read-an-object-from-file-in-java/


Update

Вы можете скопировать на объект ClassB в переменная ClassA, только если ClassB расширяет ClassA, в противном случае вы будете компилировать er или сферические зеркала ClassCastExceptions:

public class ClassB extends ClassA{ 

    ... 

} 

Это happends потому сериализованный файл содержит не только данные, но и информации о классе, который был сериализацией.

Я полагаю, что вы бывший программист на C/C++, потому что на этих языках у вас нет ошибок в этом случае.

+0

Хорошо, да, я пробовал десериализацию, но оказывается, что объект («Адресный адрес» в примере) становится одним из родительских классов ClassLoaderB. Я, наверное, нуждаюсь в размышлении или что-то в этом роде. –

+0

Я не понимаю, что вы имеете в виду. Не могли бы вы опубликовать код классов, которые вы используете для сериализации и десериализации? –

+0

Я обновил свой вопрос, пожалуйста, смотрите выше –

Смежные вопросы