3

次の問題があります。トランザクション状態を「開始、終了、または進行中」に設定できます。これを設定してから、Transactionオブジェクトをサーバーにシリアル化します。サーバーはそれを取得します。最初はチャームのように機能しますが(トランザクションが開始モードの場合)、オブジェクトを再送信すると、今回は「進行中」モードで、サーバーは引き続き「開始」モードでオブジェクトを表示します。シリアル化前の行と逆シリアル化後の行でコードをテストしましたが、これが間違いなく問題の原因です。どんな助けでも大歓迎です。関連するコードスニペットは次のとおりです。

シリアル化

        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

1 に答える 1

5

ObjectOutputStreamは、ネットワーク経由で送信するインスタンスをキャッシュします(必ずしも最適な設計のtbhとは限りません)。ただし、いずれの場合もreset、同じオブジェクトインスタンスを(再)送信するために使用する場合は、呼び出しの間にストリームを出力する必要があります。

public void reset()はIOExceptionをスローします

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

これとまったく同じ問題について議論している別のSOスレッド。

于 2012-01-21T21:38:42.883 に答える