java - 如何序列化 JBox2d World 对象?

标签 java json serialization objectoutputstream jbox2d

我有一个服务器,有多个客户端正在连接。每个客户端都有一个他们可以控制的 body (玩家),但可能会发生碰撞,因此他们需要看到其他人的 body 才能知道为什么他们的某些移动受到限制。

我的解决方案是通过对象输入/输出流传递“World”对象。然后我使用处理来解析并绘制每个主体。这是我收到的错误:

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

最佳答案

我就是因为这个原因才制作了序列化包:)

我将序列化包含到 protobufs,这可能对您来说是最好的事情(它最大程度地减少了大小)。您可以序列化世界、 body 、关节、形状,无论您想要什么粒度。

查看PbSerializer

这是有关 protobufs 的文档: https://code.google.com/p/protobuf/

关于java - 如何序列化 JBox2d World 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19236212/

相关文章:

php - 单词 null 或双引号中的字符串的正则表达式

javascript - 为什么我的 JSON 无效,即使它看起来正确?

java - Android 到 Google App Engine 序列化异常

java - Linux 上 C 与 Java 的接口(interface)

java - servlet 中的 ResourceBundle 问题

sql - 如何在 json 字段类型 postgresql 中查询空值?

c# - 通过隐藏字段传递 JSON 序列化数据

c++ - 合并几个 boost 序列化的 OpenCV Mats

java - 使用 Activator 在 Play Framework 测试中传递系统属性

java - 在浏览器中打开时,S3 对象 url 不安全(ssl)