0

我最近开始在我的游戏中添加网络,这是我第一次有这样的经验。

我正在使用这个 Slick API 来处理我的图形(以及其他一些事情)并使用 ObjectInputSteams 和 ObjectOutputStreams 来进行网络连接。

我决定通过服务器发送图像来测试连接,并遇到了图像的 NotSerializableException:

    java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException:     org.newdawn.slick.Image
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1332)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at inGame.ConnectClient.alwaysGet(ConnectClient.java:50)
at inGame.ConnectClient.setUp(ConnectClient.java:26)
at inGame.ConnectClient.run(ConnectClient.java:34)
at java.lang.Thread.run(Thread.java:680)
    Caused by: java.io.NotSerializableException: org.newdawn.slick.Image
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at inGame.ConnectServer.write(ConnectServer.java:40)
at scenes.HostMenu.update(HostMenu.java:47)
at org.newdawn.slick.state.StateBasedGame.update(StateBasedGame.java:268)
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:657)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:408)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:318)
at scenes.Head.main(Head.java:47)

我将如何使对象可序列化?还是我对所有这一切都朝着完全错误的方向前进?

任何输入表示赞赏!

谢谢!

4

2 回答 2

0

ObjectInputStream / ObjectOutputStream用于将对象发送到远程客户端。您只能以这种方式发送可序列化的对象,它们实现java.io.Serializable接口并且它们的所有非瞬态字段都是原始值实现java.io.Serializable

第一个解决方案:使所有对象可序列化。但是,如果您使用不可序列化的第三方对象,这将不起作用。

第二种解决方案:使用 java-build-in 的其他序列化。例如,您可以使用XStream,一个非常健壮的 Java 序列化/反序列化库。

第三种解决方案:XML 序列化不是发送二进制数据(例如图像)的最佳方式。在这种情况下,您需要自己处理序列化和反序列化。您将打开简单的输出/输入流并在那里写入/读取二进制数据。

于 2013-01-27T15:10:47.337 回答
0

使第三方类 Serializable 的一种简单方法是创建自己的类,该类扩展 Image 类并实现 java.io.Serializable 接口(请记住准备所有版本的构造函数并将它们委托给基类的构造函数)。

然而,Slick 的 Image 类可能是不可序列化的,这是有充分理由的。如果它包含一些与操作系统相关的低级内容,则可能无法仅将其序列化,将其发送到服务器并在那里打开。也许一些更简单的解决方案,例如将图像名称发送到服务器并从服务器上的文件加载它会更可靠?

于 2013-01-27T15:13:14.893 回答