首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确序列化/反序列化Object[]?

如何正确序列化/反序列化Object[]?
EN

Stack Overflow用户
提问于 2018-10-30 11:24:58
回答 2查看 1.4K关注 0票数 0

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

要在客户端和服务器之间转换请求,我应该有这样一个请求类:

代码语言:javascript
复制
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放入targetParams中,对于一般问题,它将得到com.google.gson.internal.LinkedTreeMap cannot be cast to the.packages.to.MyClass错误。
  2. 对于int类,Gson总是将其解析为Double,因此我不能使用targetParamTypes[i].cast(targetParams[i])强制将其强制转换为Integer(不能将Double抛给Integer),它很糟糕.

有谁有办法解决这个问题吗?如何使序列化/反序列化步骤快速准确?或者其他的工具?

我试过:

  • 葛森,先把问题弄清楚
  • Kyro,编解码系统糟透了,我不知道如何序列化/反序列化HashMap.
  • 原版,嗯,它不支持Java 9+,我的env是Java 11,太烂了!

有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2018-10-30 11:30:58

你可以看看杰克逊。杰克逊的ObjectMapper应该能够从您的Request对象转换为String,反之亦然。

编辑:添加示例

请求实体:

代码语言:javascript
复制
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

}

序列化/反序列化示例:

代码语言:javascript
复制
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);
}
票数 3
EN

Stack Overflow用户

发布于 2018-10-30 11:46:02

使用JSON代替GSON,并在pojo中实现可序列化

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53063256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档