我正在学习如何将数组转换为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”,只有类型。
2条答案
按热度按时间ccrfmcuu1#
老问题,但也许有用:我相信这是来自Gson的一个指示,即Shape(或Shape的后代)需要一个默认构造函数。
不久前我搬到了lombok,有几个类忘记了用**@NoArgsConstructor**来注解我的类。结果,在反序列化一些复杂的对象图时,Gson崩溃了,并出现了一个错误,就像您收到的一样。
希望你能想出来)
bqucvtff2#
也许Circle、Rectangle和Square需要一个无参数的构造函数。
好吧,我的回答有点太草率了。在此期间,我试图自己解决这个任务,但不幸的是也没有成功。但下面的SO显示了如何基本上解决多态列表的序列化:
https://stackoverflow.com/a/19600090/3439487
也许这会对你有帮助。