2016-04-02 7 views
0

Ich habe diese beiden Basisklassen:Wie ausgeblendetes Feld in der Oberklasse zu Gunsten der in Unterklasse GSON auszuschließen?

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

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

und einige andere, dass sie erstreckt:

class ProjectPost extends BasePost { 
    private ProjectPostMeta postMeta; 
} 

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

Wie man sehen kann ich das postMeta verstecken, wenn ich brauche.

Als ich versuchte, es mit GSON zu serialisieren, bekam ich "multiple fields" Warnung für postMeta. Ich habe in this answer mit ExclusionStrategy untersucht, aber es versteckt das Unterklasse-Feld zugunsten der Superklasse Feld.

Wie erreichen Sie den umgekehrten Weg?

+0

Deklarieren Sie das Feld, das Sie als transient ausschließen möchten, es wird nicht serialisiert. –

+0

@ Jean-BaptisteYunès Ich möchte das nicht tun, weil es es immer nicht serialisiert machen wird. Manchmal möchte ich BasePostMeta verstecken, aber manchmal nicht, weil die Basis in einer anderen Unterklasse von BasePost ausreicht. –

+0

Dann schreibe deinen eigenen Serialisierer ... Ich möchte entweder ein Feld serialisieren oder nicht, aber nicht beides. Wenn Sie wirklich wollen, abgeleitete BasePostMeta in zwei Unterklassen, eine mit allen transiente Felder die andere nicht, benennen Sie das postMeta-Feld in etwas anderes, um Konflikte zu vermeiden und dynamisch wählen welche Unterklasse für das Feld zu instanziieren. –

Antwort

0

Versuchen Sie, Generika und den Typparameter zu verwenden. Lassen Sie uns sagen, dass Ihre Basisklasse sein wird:

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

und ProjectPost zu:

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

Sie nur ein Feld genannt haben werde diese Weise

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

Die BasePost kann geändert werden postMeta und Gson sollte in der Lage sein, seinen Typ herauszufinden.

+0

Du bist der Mann. Warum habe ich nicht an Generika gedacht? Ein Problem, das ich in der Zukunft vorhersehen würde: Wenn es so viele Felder gibt, sagen wir 5, dann wären es 5 Generika. Aber es funktioniert. –

+0

In der Tat. Die Lösung besteht wahrscheinlich darin, Daten- und Domäneneinheiten zu trennen, das für JSON-Format geeignete Format für Datenentitäten zu verwenden und diese Entitäten dann in sinnvolle Domänenobjekte umzuwandeln. Dort haben Sie viel mehr Flexibilität bei der Strukturierung der Daten. – Egor

Verwandte Themen