[apache/dubbo]serialization配置fastjson2 Arrays.asList创建的集合对象 接收时对象会被解析成HashMap

2023-12-07 242 views
3

使用官方dubbo-example 1、dubbo 3.1.7 2、serialization 配置为fastjson2 对象包含集合 使用Arrays.asList创建对象的传输的时候 服务接收的时候会被解析成HashMap 例子如下: Task,class run

        ParamsDTO paramsDTO = new ParamsDTO();
        ParamsItemDTO paramsItemDTO = new ParamsItemDTO();
        paramsItemDTO.setA("aaa");
        paramsDTO.setParamsItems(Arrays.asList(paramsItemDTO));
        demoService.sayHello(paramsDTO);
//        List<ParamsItemDTO> a = new ArrayList<>();
//        a.add(paramsItemDTO);
//        paramsDTO.setParamsItems(a);
//        demoService.sayHello(paramsDTO);

ParamsDTO

@Data
public class ParamsDTO implements Serializable {
    private List<ParamsItemDTO> paramsItems;
}

ParamsItemDTO

@Data
public class ParamsItemDTO implements Serializable {
    private String a;
}

image image

使用 new ArrayList<>()不会有问题

        List<ParamsItemDTO> a = new ArrayList<>();
        a.add(paramsItemDTO);
        paramsDTO.setParamsItems(a);
        demoService.sayHello(paramsDTO);

image image

回答

8

我测试了一下,可能是fastjson2的问题。 com.alibaba.fastjson2.JSONB#parseObject()

8

https://github.com/alibaba/fastjson2/releases/tag/2.0.25

2.0.25版本发布了,问题已经修复,请帮忙验证。

升级到2.0.25 貌似问题还是存在 具体信息如下 com.alibaba.fastjson2.JSONB#parseObject() image

java.util.Base64.getEncoder().encodeToString(jsonbBytes): knNvcmcuYXBhY2hlLmR1YmJvLnNwcmluZ2Jvb3QuZGVtby5QYXJhbXNEVE8Apn9UcGFyYW1zSXRlbXMBkmNqYXZhLnV0aWwuQXJyYXlzJEFycmF5TGlzdAKVpn9KYQNMYWFhpaU=

https://github.com/apache/dubbo/issues/11703 此issues的demo可复现 image

2

@wenshao 温老师,我不知道您在2.0.25上做了什么修复改动,可以分享吗?针对此问题并未生效。 我测试和验证了这个问题,感觉应该在写入JSONWriter或者读取时FieldReader做改动。 1)代码在处理Arrays.ArrayList和普通ArrayList时,序列化ArrayList并没有写类名,但是Arrays.ArrayList当作普通类写入类名,读取时就会当作普通Object处理。 这里我想到的解决方案是:把所有List的实现都不写类名序列化。我试了下可以生效。 2)代码在反序列化时,asm生成的代码中,处理Arrays.ArrayList字段,当作普通JsonObject处理,所以专成了HashMap。 这个我想到的解决方案是:Arrays.ArrayList不使用autoType处理,由他自己的itemReader处理。 我试了可以生效,但是这个改动比较复杂,我把握不住全局。 期待跟温老师更进一步交流😀。