2

次の問題があります。トランザクションの状態を「開始、終了、または継続」に設定できます。私はこれを設定し、トランザクションオブジェクトをサーバーに渡して、それを取得します。最初にチャームのように動作します(トランザクションが開始モードになっています)。しかし、オブジェクトを再送すると、今回は「進行中」モードで、サーバは「開始」モードでそれを見続けます。私はシリアライゼーション前の行のコードとデシリアライズ後の行をテストしましたが、これは間違いなく問題がある場所です。どんな助けも非常に高く評価されるでしょう。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) { 

とトランザクションクラス:

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出力ストリーム間の呼び出しが必要です。

ます。public voidリセットは、()はIOException

リセットが既に ストリームに書き込まれているオブジェクトの状態を無視しますがスローされます。状態は、新しいObjectOutputStreamと同じ にリセットされます。ストリームの現在のポイントはリセットとしてマークされた であるため、対応するObjectInputStreamは同じポイントで にリセットされます。ストリームに以前に書き込まれたオブジェクトは、ストリーム内にすでに存在するものとはみなされません。それらは再び に書き込まれます。

Another SO thread discussing this very same issue.

+0

*手のひらを顔に当てます*。私はフラッシュがトリックをするだろうと思った...リセットについて知りませんでした。ありがとう。魅力のように動作します – user1018513

+0

オブジェクトグラフを保存するという設計目標を考えれば、それは唯一の可能性のある設計です。 – EJP

関連する問題