我正在编写一个 rpc 框架,但面临序列化问题。
你知道要在客户端和服务器之间转换 Request,我应该有一个这样的 Request 类:
class Request {
// target service class
private Class<?> targetService;
// target service method
private String targetMethod;
// target method param types
private Class<?>[] targetParamTypes;
// the params
private Object[] targetParams;
// getters & setters & contructors
}
但是:
对于
targetParams
字段,如果我使用Gson作为序列化工具,它将得到com.google.gson.internal.LinkedTreeMap无法转换为the.packages.to对于一般问题,如果我将 POJO 放入
错误。targetParams
中,则会出现 .MyClass对于
int
类,Gson 总是将其解析为Double
,因此我无法使用targetParamTypes[i].cast(targetParams[i] )
强制将其转换为 Integer(Double 无法转换为 Integer),这很糟糕...
那么有人有办法解决这个问题吗?如何使序列化/反序列化步骤快速准确?或者有什么工具推荐吗?
我已经尝试过:
- Gson,先把问题搞定
- Kyro,编解码器系统很糟糕,我不知道如何序列化/反序列化 HashMap...
- protostuff,嗯,它不支持 Java 9+,我的环境是 Java 11,糟糕!
有什么建议吗?
最佳答案
你可以看看Jackson 。 Jackson 的 ObjectMapper
应该能够将您的 Request
对象转换为 String
,反之亦然。
编辑:添加示例
请求实体:
class Request {
private Class<?> targetService;
private String targetMethod;
private Class<?>[] targetParamTypes;
private Object[] targetParams;
// needed by Jackson
private Request(){
}
public Request(Class<?> targetService,
String targetMethod,
Class<?>[] targetParamTypes,
Object[] targetParams) {
this.targetService = targetService;
this.targetMethod = targetMethod;
this.targetParamTypes = targetParamTypes;
this.targetParams = targetParams;
}
// getters and setters, needed by Jackson
}
序列化/反序列化示例:
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
Request req = new Request(String.class, "test", new Class[] {String.class}, new Object[] {"Test"});
String serialized = mapper.writeValueAsString(req);
System.out.println(serialized);
req = mapper.readValue(serialized, Request.class);
System.out.println(req);
}
关于java - 如何正确序列化/反序列化Java Object[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53063256/