【问题标题】:De-/Serialize binary data反序列化二进制数据
【发布时间】:2016-09-15 13:24:22
【问题描述】:

我目前正在对 mmorpg 的二进制网络协议进行反向工程。 我正在用java实现协议。

对于每个数据包类型, 我将创建一个代表二进制数据的类。

例如,Chat-Packet ("asd")

header = 0c75
03 00 61 73 64 00   . . a s d .

java代码:

public class Chat {
  private short length;
  private String msg;
}

是否有一个库可以将字节数组直接反序列化到对象中。基本上类似于 Jackson 或 OrmLite 用于二进制数据。

有人知道是否有可以使用的库吗? 我已经在这里和谷歌上搜索过,但没有找到我要找的东西。 我什至开始编写自己的序列化器。

【问题讨论】:

  • Protocol buffers 能帮到你吗?
  • 是的,我已经看过协议缓冲区,但我找不到任何关于它们如何序列化数据的信息。我可以控制填充字段的顺序至关重要,因为我无法控制从服务器接收的数据。我也不太喜欢定义我的数据结构然后必须将其编译成 java 的想法。
  • 服务器需要在他们的一端和你的一端实现它,以便它从同一张赞美诗中唱出来,所以那是窗外的。来自服务器的数据是二进制的吗?无论哪种方式,您都需要实现某种类型的字节数组,有一个陷阱,您如何知道数据包数据的开始/结束?
  • 是的,来自服务器的数据是二进制的。每个数据包都以它的长度为前缀,所以这不是问题。但我无法更改服务器的协议,因为协议已经存在,我只是对其进行逆向工程
  • 如果是二进制数据,您可能不想将其存储在String 中。将二进制数据传递给类的构造函数并在那里解析数据。

标签: java serialization binary jackson ormlite


【解决方案1】:

每个序列化库(我知道吗?)都定义了自己的二进制格式 - 因此二进制表示完全由类/idl 文件确定,并且无法定制以匹配自定义协议。常见的二进制格式:

如果您进行逆向工程的协议不是一个常见的协议(也许他们在内部使用 proto?)那么您唯一的选择是自己实现 Serializable/Externalizable,或者引入 kryo 并定义您自己的自定义(反)序列化器 - 无论哪种方式,您都将自己编写 Object byte[]/stream/buffer 转换逻辑。

【讨论】:

    猜你喜欢
    • 2014-01-04
    • 2014-11-28
    • 1970-01-01
    • 2016-09-29
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多