Java序列化。字段更改值

时间:2012-01-21 21:06:51

标签: java serialization client-server serializable objectoutputstream

我有以下问题。我可以将交易状态设置为“开始,结束或正在进行”。我设置了这个,然后将我的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;
}

1 个答案:

答案 0 :(得分:4)

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

  

public void reset()抛出IOException

     

重置将忽略任何对象的状态   写入流。国家被重置为   与新的ObjectOutputStream相同。流中的当前点是   标记为重置,以便重置相应的ObjectInputStream   在同一点上。以前写入流的对象不会   被称为已经在流中。他们将被写入   再次流。

Another SO thread discussing this very same issue.

相关问题