如何正确地对Java Object []进行序列化/反序列化?

时间:2018-10-30 11:24:58

标签: java json serialization protocol-buffers rpc

我正在编写一个rpc框架,但是面临有关序列化的问题。

您知道要在客户端和服务器之间转换请求,我应该有一个这样的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
}

但是:

  1. 对于targetParams字段,如果我将Gson用作序列化工具,则将POJO放入com.google.gson.internal.LinkedTreeMap cannot be cast to the.packages.to.MyClass中会因一般问题而出现targetParams错误。

  2. 对于int类,Gson始终将其解析为Double,所以我不能使用targetParamTypes[i].cast(targetParams[i])强制将其强制转换为Integer(Double不能强制转换为Integer),糟透了...

那么有人有解决问题的办法吗?如何快速,准确地进行序列化/反序列化步骤?还是推荐任何工具?

我尝试过:

  • Gson,早点解决问题
  • Kyro,编解码器系统很烂,我不知道如何序列化/反序列化HashMap ...
  • protostuff,嗯,它不支持Java 9+,我的环境是Java 11,SUCK!

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

您可以看看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);
}

答案 1 :(得分:0)

使用JSON代替GSON并在您的pojo中实现Serializable