Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何序列化JBox2d世界对象?_Java_Json_Serialization_Objectoutputstream_Jbox2d - Fatal编程技术网

Java 如何序列化JBox2d世界对象?

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.

我有一个服务器,有几个客户端连接。每个客户都有一个身体(玩家),他们可以控制,但可能会发生碰撞,因此他们需要看到其他人的身体,以了解为什么他们的一些移动受到限制

我的解决方案是将“World”对象传递到流中/流外的对象上。然后,我使用processing解析并绘制每个实体。下面是我得到的错误:

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以获得最佳序列化方法。