Java 如何序列化JBox2d世界对象?
我有一个服务器,有几个客户端连接。每个客户都有一个身体(玩家),他们可以控制,但可能会发生碰撞,因此他们需要看到其他人的身体,以了解为什么他们的一些移动受到限制 我的解决方案是将“World”对象传递到流中/流外的对象上。然后,我使用processing解析并绘制每个实体。下面是我得到的错误:Java 如何序列化JBox2d世界对象?,java,json,serialization,objectoutputstream,jbox2d,Java,Json,Serialization,Objectoutputstream,Jbox2d,我有一个服务器,有几个客户端连接。每个客户都有一个身体(玩家),他们可以控制,但可能会发生碰撞,因此他们需要看到其他人的身体,以了解为什么他们的一些移动受到限制 我的解决方案是将“World”对象传递到流中/流外的对象上。然后,我使用processing解析并绘制每个实体。下面是我得到的错误: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.jbox2d.dynamics.
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.jbox2d.dynamics.World
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at Client.setup(Client.java:30)
at processing.core.PApplet.handleDraw(PApplet.java:2280)
at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243)
at processing.core.PApplet.run(PApplet.java:2176)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.NotSerializableException: org.jbox2d.dynamics.World
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at Player.sendWorld(Player.java:57)
at Server.draw(Server.java:54)
at processing.core.PApplet.handleDraw(PApplet.java:2305)
... 3 more
显然,World在通过套接字传递之前需要序列化/序列化。你知道我会怎么做吗?我是否需要为每个主体执行以下操作:创建xml/json,然后传递它,而不是简单地发送给世界
服务器输出
public void sendWorld(World world) {
try {
out.writeObject(world);
out.flush(); // or maybe out.reset()
} catch (IOException e) {
e.printStackTrace();
}
}
中的客户端
try {
bodySocket = new Socket(serverHostname, port);
in = new ObjectInputStream(bodySocket.getInputStream());
Object next = in.readObject();
System.out.println("Getting world");
if (next instanceof World) {
this.world = (World) next;
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host: " + serverHostname);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for " + "the connection to: "
+ serverHostname);
e.printStackTrace();
System.exit(1);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
客户提款
public void draw() {
// Background
background(100);
// Bodies (includes floors, walls, and players)
for (Body body = world.getBodyList(); body != null; body = body
.getNext()) {
Vec2 playerLoc = body.getPosition();
rectMode(PApplet.RADIUS);
fill(255, 100);
rect(playerLoc.x, fieldBottom - playerLoc.y, 10, 10);
}
}
您可以看看JBbSerializer类。来自javadoc:“jbox2d的序列化程序,用于序列化物理世界的任何方面”,所以它可能会满足您的需求。在jbox2d序列化项目中查找它(应该随下载一起提供)。不过,这可能比它的价值更麻烦。我制作序列化包的原因如下:) 我将序列化包括到protobufs中,这可能是对您来说最好的事情(它最大程度地减少了大小)。你可以序列化世界、身体、关节、形状,无论你想要什么粒度 退房 以下是protobufs的文档:
如果我不能很快弄清楚这一点,我可能会遍历world body列表并创建一个json对象来保存每个body的用户数据、坐标和对象类型。将更有效的网络,但不容易写。谢谢,这可能会工作。。。PbSerializer pbs=新的PbSerializer();Builder obj=pbs.world(世界);然后在客户端上if(Builder的下一个实例){this.world=pbd.deserializeWorld((PbWorld)next)所有的文档都是C++的,不是java的。我试了好几件事,最后放弃了。应该有一个像C语言一样的页面,它不仅提供了可用的方法,而且提供了如何使用它们的简短例子。文档是C++和java,再检查::)或更多I。重要的是,您不必真的担心生成协议缓冲区,因为我已经这样做了。只需使用我在jbox2d序列化包中创建的PbSerializer和PbDeserializer类。感谢您的回复。我查看了您链接的页面,但没有看到任何Java序列化示例。也许我错过了它。我确实看到了一些方法,但没有看到它们是如何使用的以及它们期望的。我确实尝试过PS&PD类,但当我最终编译它时,我的对象编写器会传递它。我最终编写了自己的JSON解析器,但我很想看到一个世界对象从服务器传递到客户端的框架示例!我很好奇你是否决定发送一个字符串或者是套接字上的对象。protobuf对象有到字节的序列化方法,它非常高效,压缩效果也非常好。我会认真研究了解它们,它们是一个很好的工具,可以很好地为您服务(它们在业界也很流行)。你说“我的对象编写器会通过它”是什么意思?此外,您所要做的就是在您序列化的世界上调用build(),然后您可以执行类似“toByteArray()”之类的操作,查看protobuf javadoc以获得最佳序列化方法。