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

标签 java serialization objectoutputstream

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

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

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

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

最佳答案

看看 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);

在这种情况下,您可以使用内存结构来放置字节,而不是通过网络发送它们。

希望对您有所帮助!

关于java - 不使用 ObjectOutputStream 复制可序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9775022/

相关文章:

java - 数组超出索引错误

java - 使用 Android 模式实现电子邮件 validator

ruby-on-rails - rails 序列化数组验证

java - 从随机访问文件中读取对象

java - 通用类型分配表示不兼容的类型以进行更严格的分配

java - Spring Integration nioLocker 读取时出现异常

c# - JSon.Net 如何让 $type 只用于反序列化

django rest框架序列化器验证字段数据类型

java - 通过 ObjectInputStream 发送时,如何更新对象而不是完全重新写入对象

java.security.ProviderException 错误