【问题标题】:copying serializable objects without using ObjectOutputStream在不使用 ObjectOutputStream 的情况下复制可序列化对象
【发布时间】:2012-04-04 05:23:40
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果在同一台机器上玩,是运行在同一个JVM还是不同的JVM?
  • 为什么不直接添加一个拷贝构造函数或者是可克隆的?
  • 再告诉我为什么不能简单地序列化内存中的对象,然后再次反序列化它们以使用对象输入和输出流复制它们?
  • @edalorzo:再告诉我你为什么没有给出答案而不是评论? :) OP 可能没有想到这一点。
  • @Tom 我明白你的意思了!只是问题说“没有ObjectOutputStream”,所以我认为我一定错过了问题中的一些内容,即不能使用它的原因。我正在寻找确认这是避免建议任何不当内容的要求。否则,正如您指出的那样,我的问题可能是另一种选择:)

标签: java serialization objectoutputstream


【解决方案1】:

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

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

希望对你有帮助!

【讨论】:

    【解决方案2】:

    通常 sendToServer(Object) 函数只会发送对象 通过 ObjectOutputStream,但由于对象在同一 机器,我可以创建一个对象队列并推送和弹出每个对象 调用发送或接收的时间...

    但这会导致您描述的所有问题。那么为什么要做什么呢?保持原样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      相关资源
      最近更新 更多