3 回答

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
AddressInterface是一個(gè)接口,被認(rèn)為是抽象的。Foo和兩個(gè)類Bar都可以實(shí)現(xiàn)AddressInterface,但它無法判斷應(yīng)該將數(shù)據(jù)反序列化為哪一個(gè)。
可能有效的隨機(jī)想法:
將接口放在包裝器中。我只是在猜測(cè),因?yàn)槲也恢缊D書館的背景,但也許是這樣的。這里可能還有一些錯(cuò)別字,但它顯示了總體思路。
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 放入其中,這可能會(huì)中斷。
編輯 2: @Hadi 注意是正確的,Gson 會(huì)讓一些事情變得更容易,但是它會(huì)遇到同樣的問題。我確實(shí)找到了這篇文章,它解釋了如何在使用 Gson 時(shí)修復(fù)它。它對(duì)我的回答使用了類似的方法,但他們有更好的解釋。

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊
問題是反序列化 AddressInterface 屬性,因?yàn)樗且粋€(gè)接口,我認(rèn)為 objectMapper 正在嘗試初始化它的默認(rèn)構(gòu)造函數(shù),如下所示
addr = new AddressInterface();
您可以創(chuàng)建一個(gè)繼承 AddressInterface 的空具體類并使用它代替 AddressInterface
public class Adress implements AddressInterface {
...
}
public class Person {
private String id;
private String name;
private Adress addr;
}

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
使用GSON庫(kù),您可以擺脫樣板代碼!
您可以在下面的鏈接中使用 GSON 庫(kù)!
https://www.tutorialspoint.com/gson/gson_quick_guide.htm
添加回答
舉報(bào)