2016-04-02 52 views
0

我有這兩個基類:如何排除超類中的隱藏字段以支持子類GSON中的隱藏字段?

class BasePost { 
    private String id; 
    private String creator; 
    private BasePostMeta postMeta; 
} 

class BasePostMeta { 
    private String title; 
    private String content; 
} 

和其他一些是擴展它們:

class ProjectPost extends BasePost { 
    private ProjectPostMeta postMeta; 
} 

class ProjectPostMeta extends BasePostMeta { 
    private String startDate; 
    private String endDate; 
} 

正如你可以看到我會隱藏postMeta,如果我需要。

當我嘗試使用GSON對其進行序列化時,我得到了「多個字段」警告postMeta。我已經利用ExclusionStrategy研究了this answer,但它隱藏了子類字段以支持超類字段。

如何實現其他方式?

+0

聲明你想排除的字段爲'transient',它不會被序列化。 –

+0

@ Jean-BaptisteYunès我不想這樣做,因爲它總是會使它不被序列化。有時候我想隱藏BasePostMeta,但是有時候我不會,因爲BasePost的另一個子類就足夠了。 –

+0

然後編寫你自己的序列化程序...我一般要麼是序列化一個字段,要麼不是兩個字段。如果你真的想要,在兩個子類中派生BasePostMeta,其中一個包含所有字段,而另一個不是,則將postMeta字段重命名爲其他字段以避免衝突並動態選擇要爲該字段實例化的子類。 –

回答

0

嘗試使用泛型和類型參數。比方說,你的基類將是:

public class AbstractPost<T> { 
    private T postMeta; 
} 

BasePost可以改爲:

public class BasePost<BasePostMeta> { 
    private BasePostMeta postMeta; 
} 

ProjectPost到:

public class ProjectPost<ProjectPostMeta> { 
    private ProjectPostMeta postMeta; 
} 

這樣,你只有叫一個場postMeta和Gson應該能夠弄清楚它的類型。

+0

你是男人。爲什麼不考慮通用。未來我會預見到一個問題:如果有很多這樣的字段,比如說5,那麼它就是5個泛型類型。但它確實有效。 –

+0

確實。解決方案可能是將數據和域實體分開,使用任何適合您的JSON格式的數據實體,然後將這些實體變爲有意義的域對象。在那裏你將會更加靈活地構建數據。 – Egor