我有以下问题。我可以将交易状态设置为“开始,结束或正在进行”。我设置了这个,然后将我的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;
}
答案 0 :(得分:4)
ObjectOutputStream缓存它通过线路发送的实例(不一定是最好的设计tbh)。但无论如何,如果您打算使用它来(重新)发送相同的对象实例,则需要reset
调用之间的输出流。
public void reset()抛出IOException
重置将忽略任何对象的状态 写入流。国家被重置为 与新的ObjectOutputStream相同。流中的当前点是 标记为重置,以便重置相应的ObjectInputStream 在同一点上。以前写入流的对象不会 被称为已经在流中。他们将被写入 再次流。