java - 如何正确序列化/反序列化Java Object[]?

标签 java json serialization protocol-buffers rpc

我正在编写一个 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
}

但是:

  1. 对于targetParams字段,如果我使用Gson作为序列化工具,它将得到com.google.gson.internal.LinkedTreeMap无法转换为the.packages.to对于一般问题,如果我将 POJO 放入 targetParams 中,则会出现 .MyClass 错误。

  2. 对于 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/

相关文章:

java - 是否可以在不使用框架的情况下构建 Java Web 应用程序?

python - 我如何访问这个复杂的 JSON 中的嵌套数据,其中包含另一个 JSON 文档作为字符串之一?

php - 在简单的 Web 文档系统(或基本 CMS)上使用 RDBMS 与平面文件相比有什么真正的好处吗?

java - 无法构建 EntityManagerFactory

java - 模拟第一次调用失败,第二次调用成功

java - 如何将十六进制整数从字符串解析为整数?

xml - 使用 powershell 将 XML 转换为特定的 JSON 结构

ios - 为了优化目的,iOS 应用程序的 plist 应该被压缩吗?

c# - 在 C# 中将任意类型实例写入 MemoryStream

java - 为 kafka 消费者使用多个反序列化器