2012-03-19 71 views
2

我已成功使用ObjectOutputStream和ObjectInputStream爲我正在編寫的服務器和客戶機序列化和反序列化對象。服務器和客戶端通常在兩臺不同的機器上,但由於它將是一個基於回合的紙牌遊戲,我還希望用戶在本地玩,然後客戶端和服務器都將在同一臺機器上運行。在不使用ObjectOutputStream的情況下複製可序列化的對象

現在,我正在編寫我的連接接口的替代實現。該接口包含諸如void sendToServer(Object)和Object receiveFromServer()的方法。通常,sendToServer(Object)函數將通過ObjectOutputStream發送對象,但由於對象位於同一臺機器上,因此我可以創建一個對象隊列,並在每次調用發送或接收時推送和彈出。但是,問題是我不希望客戶端引用服務器使用的對象,我希望它是一個副本。而且我沒有複製構造函數,並且對象不可複製。

你會在我的情況下做什麼?

+0

如果在同一臺機器上玩,它是否運行在同一個或單獨的JVM中? – 2012-03-19 17:42:23

+0

爲什麼不只是添加一個拷貝構造函數或是可複製的? – 2012-03-19 17:42:40

+1

並告訴我爲什麼你不能簡單地序列化內存中的對象,然後再次反序列化它們以使用對象輸入和輸出流複製它們? – 2012-03-19 17:47:59

回答

4

查看ByteArrayInputStream和ByteArrayOutputStream。使用它們將您的對象序列化到內存中並從中取回它們。

ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 
ObjectOutputStream out = new ObjectOutputStream(bOut); 
out.writeObject(new Jedi("Obiwan")); 
out.close(); 

byte[] payload = bOut.toByteArray(); 

ByteArrayInputStream bIn = new ByteArrayInputStream(payload); 
ObjectInputStream in = new ObjectInputStream(bIn); 
Jedi jedi = (Jedi) in.readObject(); 
in.close(); 

System.out.println(jedi); 

在這種情況下,您可以使用內存結構來放置字節,而不是通過網絡發送它們。

我希望有幫助!

0

通常sendToServer(對象)函數將只是通過一個ObjectOutputStream發送的對象 ,但由於對象是同一 臺機器上,我可以只創建對象的一個​​隊列,推動和每個 時間彈出發送或接收被稱爲...

但是,這會導致你所描述的所有問題。那麼爲什麼要做什麼?保持它的方式。

相關問題