为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕妹3146593 2021-12-18 09:51:36
我正在编写一个 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 作为序列化工具,com.google.gson.internal.LinkedTreeMap cannot be cast to the.packages.to.MyClass如果我将 POJO 放入 中targetParams,对于通用问题,它会出错。对于int类,Gson 总是将其解析为 a Double,所以我不能使用targetParamTypes[i].cast(targetParams[i])强制将其强制转换为 Integer(Double 不能转换为 Integer),它很糟糕...那么有人有解决问题的方法吗?如何使序列化/反序列化步骤快速准确?或者有什么推荐的工具吗?我努力了:Gson,之前遇到的问题Kyro,编解码器系统很烂,我不知道如何序列化/反序列化 HashMap ......protostuff,嗯,它不支持 Java 9+,我的环境是 Java 11,糟糕!所以有什么建议吗?
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超8个赞

你可以看看杰克逊。Jackson'sObjectMapper应该能够从您的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);

}


查看完整回答
反对 回复 2021-12-18
?
月关宝盒

TA贡献1772条经验 获得超5个赞

使用 JSON 而不是 GSON 并在你的 pojo 中实现 Serializable


查看完整回答
反对 回复 2021-12-18
  • 2 回答
  • 0 关注
  • 186 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号