Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不使用ObjectOutputStream复制可序列化对象_Java_Serialization_Objectoutputstream - Fatal编程技术网

Java 不使用ObjectOutputStream复制可序列化对象

Java 不使用ObjectOutputStream复制可序列化对象,java,serialization,objectoutputstream,Java,Serialization,Objectoutputstream,我已经成功地使用ObjectOutputStream和ObjectInputStream为我正在编写的服务器和客户端序列化和反序列化对象。服务器和客户端通常在两台不同的机器上,但由于这将是一个基于回合的纸牌游戏,我还希望用户在本地玩,然后客户端和服务器将在同一台机器上运行 现在,我正在编写连接接口的替代实现。该接口包含void sendToServer(Object)和Object receiveFromServer()等方法 通常sendToServer(Object)函数只通过ObjectO

我已经成功地使用ObjectOutputStream和ObjectInputStream为我正在编写的服务器和客户端序列化和反序列化对象。服务器和客户端通常在两台不同的机器上,但由于这将是一个基于回合的纸牌游戏,我还希望用户在本地玩,然后客户端和服务器将在同一台机器上运行

现在,我正在编写连接接口的替代实现。该接口包含void sendToServer(Object)和Object receiveFromServer()等方法

通常sendToServer(Object)函数只通过ObjectOutputStream发送对象,但由于对象在同一台机器上,我可以创建一个对象队列,并在每次调用send或receive时推送和弹出。然而,问题是我不希望客户端引用服务器使用的对象,我希望它是一个副本。我没有复制构造函数,对象也不可克隆


在我的情况下,你会怎么做?

看看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”,所以我想我一定错过了问题中的某些内容,即为什么不能使用它。我正在寻求确认,这是一项避免提出任何不适当建议的要求。否则,我的问题可能是另一个选择,正如你所指出的:)