2013-07-24 179 views
0

我的任務是複製從ClassLoaderBClassB對象ClassLoaderAClassAClassLoaderAClassLoaderB的子女。複製對象

我試圖用系列化和保存類ClassB

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

下一步將閱讀對象爲ClassLoaderAClassA。我怎樣才能做到這一點?

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

我認爲,最簡單的方法是從類加載器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; 
     } 
    } 
} 

的代碼已經摘自: http://www.mkyong.com/java/how-to-read-an-object-from-file-in-java/


更新

您可以在對象ClassB的複製到僅當ClassB擴展ClassA時纔是ClassA的變量,否則您將編譯er RORS或ClassCastExceptions異常:

public class ClassB extends ClassA{ 

    ... 

} 

這happends因爲序列化的文件不僅包含數據,還約了一個序列化類信息。

我想你是一名前C/C++程序員,因爲在這種情況下,你在這種情況下沒有錯誤。

+0

好吧,是的,我嘗試了反序列化,但事實證明,該對象(示例中的「地址」)成爲父ClassLoaderB之一。我可能需要反思或什麼.. –

+0

我不明白你的意思。你可以發佈你用來序列化和反序列化的類的代碼嗎? –

+0

我已更新我的問題,請看上面 –