导出和导入gson -无法调用没有参数的public

0wi1tuuw  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(196)

我正在学习如何将数组转换为json文件,并使用gson导入该数组。

public abstract class Shape {
private Type typeOfShape;

public abstract double countArea();

public abstract double countCircuit();
}

和类Circle、Rectangle、Square,它们扩展了Shape,例如Rectangle

public class Rectangle extends Shape {
private double a;
private double b;

public Rectangle(Type type, int a, int b) {
    super(type);
    this.a = a;
    this.b = b;
}

@Override
public double countArea() {
    return a * b;
}

@Override
public double countCircuit() {
    return a * 2 + b * 2;
}

和2种方法:

public static List<Shape> importShapeListFromJsonWithGson(String path) throws IOException {
    Type listType = new TypeToken<List<Shape>>() {}.getType();
    Gson gson = new GsonBuilder().create();
    Reader reader = new FileReader(path);
    List<Shape> result = gson.fromJson(reader, listType);
    return result;
}

public static void exportShapeListToJsonWithGson(List<Shape> list, String path) throws IOException {
    Writer writer = new FileWriter(path);
    Gson gson = new GsonBuilder().create();
    gson.toJson(list, writer);
    writer.close();
}

但是我在线程“main”中遇到异常java.lang。调用没有参数的公共Shape()失败。问题是,我使用的是抽象类吗?我尝试从Shape中删除abstract,然后再编译一次,但我只得到了包含形状的列表,没有例如“a”或“b”,只有类型。

ccrfmcuu

ccrfmcuu1#

老问题,但也许有用:我相信这是来自Gson的一个指示,即Shape(或Shape的后代)需要一个默认构造函数。
不久前我搬到了lombok,有几个类忘记了用**@NoArgsConstructor**来注解我的类。结果,在反序列化一些复杂的对象图时,Gson崩溃了,并出现了一个错误,就像您收到的一样。
希望你能想出来)

bqucvtff

bqucvtff2#

也许Circle、Rectangle和Square需要一个无参数的构造函数。
好吧,我的回答有点太草率了。在此期间,我试图自己解决这个任务,但不幸的是也没有成功。但下面的SO显示了如何基本上解决多态列表的序列化:
https://stackoverflow.com/a/19600090/3439487
也许这会对你有帮助。

相关问题