2012-05-19 25 views
2

美好的一天,Java引用對象的序列化是「失去價值」?

我有一個有趣的問題,我不明白。我有一個名爲「HomeScreenManager」的類,它維護一個LinkedList <字符串>調用聊天。 HomeScreenManager實例駐留在服務器上,負責跟蹤連接和聊天記錄。然後我創建了一個名爲「ProtocolHomeScreen」的類,它是一個類LinkedList <字符串>調用聊天並實現Serializable。當需要通過聊天更新所有客戶端時,我想發送ProtocolHomeScreen。所以我創建了一個全新的ProtocolHomeScreen實例,我說它是鏈接的字符串列表「獲取」HomeScreen的鏈接列表。換句話說,我想要序列化的鏈表是在不同的類中創建的,但我用另一個實例指向它。問題是數據沒有被髮送,只有一個空的LinkedList出現在另一邊。我一行一行地完成了調試器並檢查了所有的變量,在我調用writeObject之前,一切看起來都很好,但是在客戶端,當我收到ProtocolHomeScreen實例時,鏈表是空的! (它不是null)任何想法?謝謝!

public class HomeScreenManager implements ObjectMessageHandler, Serializable 
{ 
protected LinkedList<User> users; 
protected LinkedList<String> chat; 
protected LinkedList<String> sessions; 

public HomeScreenManager() 
{ 
    chat = new LinkedList<String>(); 
    users = new LinkedList<User>(); 
    sessions = new LinkedList<String>(); 
} 
protected void handleChat(String message) 
{ 
    chat.add(message); 

    ProtocolHomeScreen p = new ProtocolHomeScreen(this); 

    for(User u:users) 
    { 
     u.connection.WriteObject(p); //At this point in time, p has the correct data, but when I deserialize p, the chat list is empty... 
    } 
} 

然後這裏是協議類...

public class ProtocolHomeScreen implements Serializable 
{ 
    public LinkedList<String> chat; 
    public LinkedList<String> players; 
    public LinkedList<String> sessions; 


    public ProtocolHomeScreen(HomeScreenManager hms) 
    { 
     players = new LinkedList<String>(); 
     for(User u:hms.getUsers()) 
     { 
      players.add(u.getUsername()); 
     } 
     sessions = hms.getSessions(); 
     chat = hms.getChat(); 

     chat = new LinkedList<String>(); 

     for(String s: hms.getChat()) 
     { 
      chat.add(s); 
     } 

    } 

} 

編輯

這是在客戶端代碼......注意,玩家的鏈表遇到就好了,但我認爲這與我在ProtocolHomeScreen的構造函數中創建一個新實例有關(在服務器端)

else if(obj instanceof ProtocolHomeScreen) 
     {  
      ProtocolHomeScreen phs = (ProtocolHomeScreen) obj; 

      sessionModel.removeAllElements(); 
      playersModel.removeAllElements(); 
      chatOutput.setText(""); 
      for(String s:phs.players) 
       playersModel.addElement(s); 

      for(String s:phs.sessions) 
       sessionModel.addElement(s); 

      for(String s:phs.chat) 
      { 
       chatOutput.setText(chatOutput.getText()+s); 
      } 

     } 
+0

您的讀/寫代碼是什麼樣的? *是通過另一方來代替您期望的數據? –

回答

3

您需要查看ObjectOutputStream.reset()以及它存在的原因。任何給定的對象只能通過ObjectOutputStream發送一次,除非您reset()流或使用writeUnshared().

+1

啊,非常感謝!我認爲這是問題......這非常有道理。您的回覆將我帶到了這個網站http://www.javaspecialists.eu/archive/Issue088.html,這是關於何時使用重置的另一個教程。謝謝你的幫助! – Matthew