问题描述
简要描述您碰到的问题。 使用中发现一些类序列化为空对象,使用场景为字段都在基类中,没有set方法,仅有get,子类使用构造函数初始化字段
环境信息
OS信息: [e.g.:CentOS 8.4.2105 4Core 3.10GHz 16 GB] JDK信息: [e.g.:Openjdk 17] 版本信息:[e.g.:Fastjson2 2..0.7] 重现步骤
如何操作可以重现该问题:
interface IBase { int getId(); String getName(); } abstract class Base implements IBase { private int id; private String name; protected Base(int id, String name) { this.id = id; this.name = name; }
public int getId() {
return id;
}
public String getName() {
return name;
}
}
class Device extends Base implements IBase {
public Device(int id, String name) {
super(id, name);
}
}
interface Ixx {
IBase getBase();
}
class Xx implements Ixx {
private IBase base;
public Xx(IBase base) {
this.base = base;
}
public IBase getBase() {
return base;
}
}
var device = new Device(1, "xxx"); var xx = new Xx(device); var str = JSON.toJSONString(xx); System.out.println(str); var x = JSON.parseObject(str, Xx.class); System.out.println(x);
我在测试服务器上发现序列化为空后代码调整了,不使用接口 本机模拟时序列化没问题,反序列化时数据丢失 测试服务器为grallvm openjdk 17,本机oracle jdk 17
原提问者GitHub用户cjdxhjj
要保留类型信息,序列化的时候需要使用JSONWriter.Feature.WriteClassName),反序列化的时候需要JSONReader.Feature.SupportAutoType
public void test() {
Device device = new Device(1, "xxx");
Xx xx = new Xx(device);
String str = JSON.toJSONString(xx, JSONWriter.Feature.WriteClassName);
System.out.println(str);
Xx x = JSON.parseObject(str, Xx.class, JSONReader.Feature.SupportAutoType);
assertEquals(xx.base.getClass(), x.base.getClass());
}
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。