我最近开始在我的游戏中添加网络,这是我第一次有这样的经历。
我正在使用这个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)
如何使对象可序列化?或者我是否会完全错误地指出这一切?
感谢任何输入!
谢谢!
答案 0 :(得分:0)
您正在使用ObjectInputStream / ObjectOutputStream
将对象发送到远程客户端。您只能以这种方式发送可序列化,t。的对象。他们实施java.io.Serializable
界面,所有非瞬态字段都是原始值或实现java.io.Serializable
。
第一个解决方案:使所有对象都可序列化。但是,如果您使用不可序列化的第三方对象,则无法使用此功能。
第二个解决方案:使用java-build-in的其他序列化。例如,您可以使用 XStream ,非常强大的Java序列化/反序列化库。
第三种解决方案:XML序列化不是发送二进制数据(如图像)的最佳方式。在这种情况下,您需要处理序列化和反序列化本身。您将打开简单的输出/输入流并写入/读取二进制数据。
答案 1 :(得分:0)
制作第三方类Serializable的一种简单方法是创建自己的类,扩展Image类并实现java.io.Serializable接口(记得准备所有版本的构造函数并将它们委托给基类'构造函数)。
然而,Slick的Image类可能不是可序列化的,原因很简单。如果它包含一些与操作系统相关的低级操作,则可能无法将其序列化,将其发送到服务器并在那里打开。也许一些简单的解决方案,比如将图像名称发送到服务器并从服务器上的文件加载它会更可靠吗?