pb、json 数据协议扩展
介绍
框架支持同样的一套业务代码,无需变更就能支持不同的数据协议,如 protobuf、json,并支持扩展。
在框架中切换协议是简单的,只需要一行代码。
tip
默认数据协议编解码是 jprotobuf。
使用 json 编解码
JsonDataCodec 是框架内置的一个 json 编解码器。
- code 3,设置 json 编解码
public class JsonApplication {
public static void main(String[] args) {
IoGameGlobalSetting.setDataCodec(new JsonDataCodec());
int port = 10100;
var demoLogicServer = new JsonLogicServer();
NettySimpleHelper.run(port, List.of(demoLogicServer));
}
...
}
warning
如果使用框架默认提供的 json 编解码,需要开发者在 pom.xml 中添加 fastjson2 的依赖。
pom.xml
<!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>fastjson2.version</version>
</dependency>
action 业务代码
让我们先看一个 action 的业务代码片段。
@ActionController(19)
public class JsonAction {
@ActionMethod(1)
public HelloMessage hello(HelloMessage message) {
message.name = message.name + ",hello json";
return message;
}
}
@ProtobufClass
@FieldDefaults(level = AccessLevel.PUBLIC)
public class HelloMessage {
public String name;
}
细心的朋友会发现 HelloMessage 中有 ProtobufClass 注解,不必担心,这并不会影响我们的代码运行。 这里的 ProtobufClass 注解是没有任何作用的,因为我们现在使用的是 json 编解码器, 简单点说 ProtobufClass 注解是可有可无的。
既然 HelloMessage 类中的 ProtobufClass 注解可有可无,那么为什么还要写在这里呢? 这里想要表达的是,如果我们之前的项目使用的是默认的编解码器 jprotobuf , 那么可以实现无需修改任何代码就能支持 json 格式。
这意味着我们可以使用一套业务代码,在不改动的情况下就能支持不同的数据协议。
如何扩展
目前,框架内置支持了 jprotobuf、json 数据协议。
开发者可通过 DataCodec 接口来扩展其他的数据协议支持,如 jackson、 fory、 flatbuffers、 simple-binary-encoding。
public final class MyDataCodec implements DataCodec {
@Override
public byte[] encode(Object data) {
// your encode
}
@Override
public <T> T decode(byte[] data, Class<?> dataClass) {
// your decode
}
@Override
public String codecName() {
return "MyDataCodec";
}
}
注意事项
框架默认的数据协议编解码是 jprotobuf,如果使用了其他的,那么以下这些地方也需要使用相同的
- 游戏对外服
- Broker(游戏网关)
- 游戏逻辑服
如果使用了模拟客户端,也需要与服务器保持同样的数据协议编解码。