2010-02-26 53 views
-1

我正在尋找一種將Java中的類序列化爲其超類的方法,然後將其轉換爲字節數組並通過網絡發送。Java中的對象的Serialize超類

下面是一個例子:

class SuperClass { 
    public int number1; 
} 

class SubClass extends SuperClass { 
    public int number2; 
} 

我不認爲這是可以簡單地投子類的對象轉換成父類,然後將其序列化,還是我錯了?有沒有辦法做到這一點「轉換」,而不必手動將所有從一個SubClass繼承的值複製到一個新的SuperClass?

編輯:嗯,我意識到我是通過按照我原先想到的方式拍攝自己的腳,所以我決定要做的只是序列化SubClass,並在網絡連接的兩側使用它。這是最簡單的事情,我不必擔心鑄造和繼承。

+0

我不完全明白。你想在網絡的另一端「補水」什麼?一個SuperClass實例? – helios 2010-02-26 17:38:24

+0

你在尋找'writeReplace'(並實現'Serializable'')嗎?儘管幾乎可以肯定的是「更喜歡構圖而不是繼承」。 – 2010-02-26 18:08:47

回答

0

我不認爲這是可以簡單地投子類的對象轉換成父類,然後序列化

你有沒有嘗試過呢......那是最簡單的方法,看看什麼是可能的...

如果您想獲取序列化對象的字節數組,Serialise爲ByteArrayOutputStream。

0

我認爲你的標題的措辭不是你真正想要的。

我正在尋找一種方法來序列化Java中的類並通過網絡發送它。

上述問題聽起來更真實。

你需要的東西是這樣的:

public class SuperClass implements Serializable { 
    ... 
} 

public class Messenger { 
    ... 

    public void send (SuperClass obj) { 
     ObjectOutputStream oos = new ObjectOutputStream (socket.getOutputStream()); 
     oos.writeObject (obj); 
     oos.close(); 
    } 

    public SuperClass receive() { 
     //some work with ServerSocket#accept() should be here 
    } 
} 

你可以用它的超類或任何其子類的實例上面的代碼標的移交。但是如果在其中一個子類型中只需要傳送一部分對象而其餘部分應該設置爲「在另一側」,那麼您應該將方法readObject()writeObject()添加到該超類。閱讀一些關於序列化的教程以獲取更多詳細信息(link)。

UPD:

如果上連載接收對象不加載已收到的類對象,那麼你會得到一個異常對方程序。

這就是爲什麼你需要爲了傳輸未知sublass的對象進行下一個步驟:

  1. 轉移對象的類別及其name到另一邊。

  2. 在另一側裝載轉移的類(即Class.forName (classname))。

  3. 現在發送該對象。

最困難的部分是第一步。想想怎麼做。我現在沒有必要的例子,但如果在那之前你不能找到解決方案,我可能會將其後發佈。

+0

嗯,是的,但另一端的客戶端不知道名爲SubClass的類,只有SuperClass。我試圖從SubClass轉換爲SuperClass,它可以工作,但對象仍然是一個子類。我想將SubClass的一個對象轉換爲SuperClass,然後序列化它。 – Bevin 2010-02-26 17:39:32

+0

啊,現在很清楚。將此評論添加到您的問題。你需要另一種方法。我會盡力更新我的答案,但我現在沒有太多時間。 – Roman 2010-02-26 17:46:37

1

在OO的概念中:「子類」總是「超級類」。所以不需要投射/複製/轉換。只需使用它作爲SuperClass。