2

我遇到以下問題。我可以將交易狀態設置爲「開始,結束或正在進行」。我設置了它,然後將我的Transaction對象序列化到檢索它的服務器上。第一次(當事務處於啓動模式時)就像魅力一樣工作,但是當我重新發送對象時,這次是「正在進行中」模式,服務器繼續以「開始」模式看到它。我測試了序列化之前的代碼和反序列化之後的代碼,這肯定是問題所在。任何幫助將非常感激。相關的代碼段如下:Java序列化。字段更改值

序列

 if ((query instanceof Transaction) && !(trx.getTransactionState()==Consts.trx_start)) System.out.println("Not start"); 
     oos.writeObject(query); 
     oos.flush(); 

反序列化

while (true) { 
       Object statement = null; 

       try { 

        statement = ois.readObject(); 
        if ((statement instanceof Transaction) && !(((Transaction) statement).getTransactionState()==Consts.trx_start)) System.out.println("Not start 2"); 
        handle_statement(statement, socket); 
       } catch (IOException e) { 

和Transaction類:

public class Transaction extends Statement{ 

/** 
* 
*/ 
private static final long serialVersionUID = -2284996855537430822L; 
Statement statement_list; 
int trx_state; 


/** 
* 
*/ 
public Transaction() { 
    trx_state = Consts.trx_start;; 
} 

/** 
* @param statement 
*/ 
public void setStatement(Statement statement) { 
    statement_list = statement; 
} 


public void setTransactionState(int state) { 
     trx_state = state; 
} 

public int getTransactionState() { 
    return trx_state; 
} 
/** 
* @return 
*/ 
public Statement getStatement() { 
    return statement_list; 
} 

回答

4

ObjectOutputStream緩存實例,它發送過來的電線(不一定是最好的設計tbh)。但是無論如何,如果您打算使用它來(重新)發送相同的對象實例,則需要在中間調用輸出流reset

公共無效復位()拋出IOException異常

重置將丟棄已 寫入流中的所有對象的狀態。該狀態被重置爲與新的ObjectOutputStream相同的 。流中的當前點是 標記爲重置,因此相應的ObjectInputStream將在同一點重置 。以前寫入流的對象將不會被引用爲已在流中的 。他們將再次被寫入 流。

Another SO thread discussing this very same issue.

+0

*捂臉*。我認爲沖洗會做的伎倆...不知道重置。謝謝。像魅力一樣工作 – user1018513

+0

考慮到保留對象圖的設計目標,它是唯一可能的設計。 – EJP