Java 不使用ObjectOutputStream复制可序列化对象
我已经成功地使用ObjectOutputStream和ObjectInputStream为我正在编写的服务器和客户端序列化和反序列化对象。服务器和客户端通常在两台不同的机器上,但由于这将是一个基于回合的纸牌游戏,我还希望用户在本地玩,然后客户端和服务器将在同一台机器上运行 现在,我正在编写连接接口的替代实现。该接口包含void sendToServer(Object)和Object receiveFromServer()等方法 通常sendToServer(Object)函数只通过ObjectOutputStream发送对象,但由于对象在同一台机器上,我可以创建一个对象队列,并在每次调用send或receive时推送和弹出。然而,问题是我不希望客户端引用服务器使用的对象,我希望它是一个副本。我没有复制构造函数,对象也不可克隆Java 不使用ObjectOutputStream复制可序列化对象,java,serialization,objectoutputstream,Java,Serialization,Objectoutputstream,我已经成功地使用ObjectOutputStream和ObjectInputStream为我正在编写的服务器和客户端序列化和反序列化对象。服务器和客户端通常在两台不同的机器上,但由于这将是一个基于回合的纸牌游戏,我还希望用户在本地玩,然后客户端和服务器将在同一台机器上运行 现在,我正在编写连接接口的替代实现。该接口包含void sendToServer(Object)和Object receiveFromServer()等方法 通常sendToServer(Object)函数只通过ObjectO
在我的情况下,你会怎么做?看看ByteArrayInputStream和ByteArrayOutputStream。使用它们将对象序列化到内存中并从中取回
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bOut);
out.writeObject(new Jedi("Obiwan"));
out.close();
byte[] payload = bOut.toByteArray();
ByteArrayInputStream bIn = new ByteArrayInputStream(payload);
ObjectInputStream in = new ObjectInputStream(bIn);
Jedi jedi = (Jedi) in.readObject();
in.close();
System.out.println(jedi);
在这种情况下,您可以使用内存结构来放置字节,而不是通过网络发送它们
我希望这有帮助
通常sendToServer(Object)函数只发送对象
通过ObjectOutputStream,但由于对象位于同一个
机器,我可以创建一个对象队列,然后推送和弹出每个对象
调用发送或接收的时间
但这导致了你所描述的所有问题。那你为什么要这么做?保持原样。如果在同一台机器上玩,它是在同一个JVM中运行还是在单独的JVM中运行?为什么不添加一个复制构造函数或可克隆?请再次告诉我,为什么不能简单地在内存中序列化对象,然后再次反序列化它们,以使用对象输入和输出流来复制它们?@edalorzo:并再次告诉我,为什么你没有给出答案,而不是一个答案评论:)有可能OP没有想到这点。@Tom我明白你的意思了!只是问题说“没有ObjectOutputStream”,所以我想我一定错过了问题中的某些内容,即为什么不能使用它。我正在寻求确认,这是一项避免提出任何不适当建议的要求。否则,我的问题可能是另一个选择,正如你所指出的:)