Java对象返回到默认值
我有以下代码结构 transaction类型的事务处理程序,它是客户端处理程序类中的一个字段,与服务器对话。(客户机处理程序和服务器并置),客户机通过序列化对象消息与客户机处理程序对话 当一个新的事务请求从客户端传入时,(在线程上使用对象输入流的readObject()方法),我会执行一系列的trx_handler.setFoo(trx.getFoo))。这很好,我可以处理第一个请求。但当后续请求进入时(由于循环结构,只有在第一个请求完成后才开始执行),我发现trx处理程序已重新初始化为其默认值,对象仍然存在,但其中的所有值都是defaut值。是什么导致了这个问题 我的第一个猜测是垃圾收集,但在我的客户机处理程序类中,总是有一个指向这个trx_处理程序的指针 下面的代码说明了发生的情况。语句首先应为start类型,因此将正确初始化trx_处理程序。然后将调用handle_语句。随后应接收后续语句,但此时trx_处理程序已重新初始化为其默认设置,因此access_set字段为空,会话id,并且对hande_语句中的对象所做的任何修改都不可见 谢谢Java对象返回到默认值,java,sockets,serialization,Java,Sockets,Serialization,我有以下代码结构 transaction类型的事务处理程序,它是客户端处理程序类中的一个字段,与服务器对话。(客户机处理程序和服务器并置),客户机通过序列化对象消息与客户机处理程序对话 当一个新的事务请求从客户端传入时,(在线程上使用对象输入流的readObject()方法),我会执行一系列的trx_handler.setFoo(trx.getFoo))。这很好,我可以处理第一个请求。但当后续请求进入时(由于循环结构,只有在第一个请求完成后才开始执行),我发现trx处理程序已重新初始化为其默认值
public class Handler {
private Statement trx_handler;
/* Constructor initialises trx_handler to new Statement(); */
public ClientHandler(final Socket socket, long uid, Server server, ObjectInputStream ois) throws IOException, Exception {
LOGGER.info("Constructing Handler");
this.uid = uid;
this.server = server;
this.socket = socket;
this.database = server.getDB();
this.trx_sys = database.getTransactionManager();
create_listening(socket, ois);
out = socket.getOutputStream();
oos = new ObjectOutputStream(out);
this.trx_handler = new Statement(false);
}
您需要为每个事务发送一个全新的对象,使用
ObjectOutputStream.writeUnshared()
,或者调用ObjectOutputStream.reset()< /code >在发送之间。这与垃圾收集无关,可能是代码中的一个bug。我认为我们不能根据目前所提供的信息来猜测bug是什么。请考虑调试更多,然后发布更多相关的代码和信息。(更新以添加更详细的代码)问题不在于我通过输出流发送的对象(例如,我已经在使用reset)但是,对于客户端处理程序中的field对象,由于某种原因,它似乎在两次handle语句调用之间被重新初始化为默认的field值。@user1018513真的吗?您读过Javadoc吗?您是否知道,如果您第二次发送相同的对象两次,并且发送了不同的值,您将不会收到更改的值?您知道吗你尝试过这些建议吗?是的,并实现了它们。我在对象流中收到的语句对象包含正确的值。重置的是trx处理程序。你没有说明如何/在何处实例化类处理程序,这很可能是问题所在。因此,你的代码中有一个bug,你没有发布的部分。Specu喋喋不休地谈论垃圾收集或其他神奇地重置你的田地的事情只不过是抓住稻草而已。
private void create_incoming(final Socket socket, final ObjectInputStream stream) {
Thread incoming = new Thread() {
@Override
public void run() {
ObjectInputStream ois = stream;
InputStream in = null;
while (true) {
Object statement = null;
try {
statement = ois.readObject();
execute_stat(statement, socket, null);
LOGGER.info("Ready to execute next ");
} catch (SocketException e) {
LOGGER.severe("Connection Closed");
return;
} catch (IOException e) {
LOGGER.severe("Connection Closed");
return;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
String error_message = e.getMessage();
send_error(socket, error_message);
}
}
}
};
incoming.setDaemon(true);
incoming.start();
}
private synchronized void execute_stat(Statement trx) {
if (trx.getTransactionState() == Consts.trx_end) {
trx_sys.commitTransaction(trx_handler);
return;
} else if (trx.getTransactionState() == Consts.trx_start) {
try {
trx_handler.setAccessSet(trx.getAccessSet());
trx_handler.setSession_id(trx.getSession_id());
trx_sys.startTransaction(trx_handler);
handle_statement(socket, trx_handler);
/* TEST HERE THAT FIELDS IN TRX_HANDLER ARE CORRECTLY SET (INCLUDING SOME MODIFIED IN
handle_statement and they are correctly set */
return;
} catch (Exception ex) {
Logger.getLogger(ClientHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}
try {
LOGGER.info("Execute Trx: stat");
/* Can't see modifications made in the start case */
Statement stats = trx.getStatement();
trx_handler.setStatement(stats);
handle_statement(stats, socket, trx_handler);
} catch (Exception e) {
e.printStackTrace();
}
return;
}