3 回答

TA贡献1793条经验 获得超6个赞
AddressInterface是一个接口,被认为是抽象的。Foo和两个类Bar都可以实现AddressInterface,但它无法判断应该将数据反序列化为哪一个。
可能有效的随机想法:
将接口放在包装器中。我只是在猜测,因为我不知道图书馆的背景,但也许是这样的。这里可能还有一些错别字,但它显示了总体思路。
public class AbstractSerializable<T> implements Deserialize {
private final String className;
private T obj;
public AbstractSerializable(T obj) {
this.obj = obj;
this.className = obj.getClass().getCardinalName();
}
@Override
public AbstractSerializable deserialize(ObjectMapper objectMapper) {
String clazz = input.readNext(String.class);
return objectMapper.readNext(Class.forName(clazz));
}
}
编辑:如果您尝试将 lambda 放入其中,这可能会中断。
编辑 2: @Hadi 注意是正确的,Gson 会让一些事情变得更容易,但是它会遇到同样的问题。我确实找到了这篇文章,它解释了如何在使用 Gson 时修复它。它对我的回答使用了类似的方法,但他们有更好的解释。

TA贡献1798条经验 获得超3个赞
问题是反序列化 AddressInterface 属性,因为它是一个接口,我认为 objectMapper 正在尝试初始化它的默认构造函数,如下所示
addr = new AddressInterface();
您可以创建一个继承 AddressInterface 的空具体类并使用它代替 AddressInterface
public class Adress implements AddressInterface {
...
}
public class Person {
private String id;
private String name;
private Adress addr;
}

TA贡献1911条经验 获得超7个赞
添加回答
举报