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個贊
添加回答
舉報