我正在编写一个rpc框架,但面临一个关于序列化的问题。
要在客户端和服务器之间转换请求,我应该有这样一个请求类:
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作为序列化工具,如果我将POJO放入targetParams中,对于一般问题,它将得到com.google.gson.internal.LinkedTreeMap cannot be cast to the.packages.to.MyClass错误。int类,Gson总是将其解析为Double,因此我不能使用targetParamTypes[i].cast(targetParams[i])强制将其强制转换为Integer(不能将Double抛给Integer),它很糟糕.有谁有办法解决这个问题吗?如何使序列化/反序列化步骤快速准确?或者其他的工具?
我试过:
有什么建议吗?
发布于 2018-10-30 11:30:58
你可以看看杰克逊。杰克逊的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);
}发布于 2018-10-30 11:46:02
使用JSON代替GSON,并在pojo中实现可序列化
https://stackoverflow.com/questions/53063256
复制相似问题