Java 序列化。字段更改值

use*_*513 3 java serialization client-server objectoutputstream serializable

我有以下问题。我可以将事务状态设置为“开始、结束或正在进行”。我设置了这个,然后将我的 Transaction 对象序列化到服务器,后者检索它。第一次(当事务处于启动模式时)像魅力一样工作,但是当我重新发送对象时,这次在“正在进行”模式下,服务器继续在“启动”模式下看到它。我已经在序列化之前的行和反序列化之后的行中测试了代码,这绝对是问题所在。任何帮助将不胜感激。相关代码片段如下:

连载

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

反序列化

    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) {
Run Code Online (Sandbox Code Playgroud)

和交易类:

    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;
}
Run Code Online (Sandbox Code Playgroud)

Per*_*ion 5

ObjectOutputStream的,它发送过来的电线(不一定是最好的设计TBH)缓存实例。但无论如何,reset如果您计划使用它来(重新)发送相同的对象实例,则需要在调用之间输出流。

public void reset() 抛出 IOException

重置将忽略已写入流的任何对象的状态。状态被重置为与新的 ObjectOutputStream 相同。流中的当前点被标记为重置,因此相应的 ObjectInputStream 将在同一点重置。先前写入流的对象不会被称为已在流中。它们将再次写入流。

另一个 SO 线程讨论这个非常相同的问题。