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