Wie können Aufrufe von .serializeWithType () einer Klasse ausgelöst werden, die JsonSerializable in Jackson implementiert?

8

Das ist Jackson 2.2.x.

Ich habe eine Klasse, die JsonSerializable ; Für diese Schnittstelle gibt es zwei Methoden, serialize() und serializeWithType() .

Ich möchte {de} Serialisierung dieser Klasse testen, und ich kann Aufrufe von serialize() leicht auslösen; nicht jedoch serializeWithType() .

Die javadoc für diese letztere Methode sagt, dass diese Methode

genannt wird
  

[...] wenn zusätzliche Typinformationen in die Serialisierung einbezogen werden sollen, damit die Deserialisierung verwendet werden kann.

Ich verstehe einfach nicht, was das bedeutet ...

Wie richte ich eine Testumgebung ein, damit diese Methode aufgerufen wird? Beachten Sie, dass der zu serialisierende JSON von einem beliebigen Typ sein kann, außer dem Objekt (dh Boolean, Zahl, String, Array sind alle gültigen Typen).

    
fge 31.10.2014, 10:20
quelle

3 Antworten

9

Diese Methode wird verwendet, wenn Sie Polymorphie verwenden möchten

%Vor%

Wenn Sie eine Instanz von C serialisieren und dann versuchen, das resultierende json zu deserialisieren, aber nur wissen, dass es ein Untertyp von A ist:

%Vor%

Sie müssen etwas in dem resultierenden JSON speichern, um den realen Typ des serialisierten Objekts beizubehalten.

Dies kann entweder mit @JsonTypeInfo in Ihrer Klasse oder durch Aufruf von enableDefaultTyping in ObjectMapper aktiviert werden.

Dies ist ein Beispiel-Testfall mit JUnit & amp; Mockito

%Vor%     
Thomas Maurel 05.11.2014, 09:47
quelle
4

Jackson 2 ist komplett inkompatibel mit Jackson 1 und JsonSerializableWithType (jetzt veraltet und unbrauchbar) ist eine Schnittstelle von Jackson 1 was zu der Anwesenheit von serializeWithType() in Jackson 2 führte.

serializeWithType() wird aufgerufen, wenn zusätzliche Typinformationen erwartet werden, was bedeutet, dass eine Annotation ( JsonTypeInfo ) die Klasse property für die Deserialisierungsdelegierung angibt, wenn Polymorphismus verwendet wird. Diese Methode wird dann mit den zusätzlichen Typinformationen innerhalb eines TypeSerializer aufgerufen, das mit einem Typpräfix geschrieben werden kann:

%Vor%

Indem Sie die Klasse mit @JsonTypeInfo kommentieren, können Sie die Serialisierung mit den Typinformationen angeben:

%Vor%

Dann werden die Werte typeint und typefloat in der Eigenschaft type gesetzt. Wenn Sie ein MyNumber deserialisieren, basiert dies auf Polymorphie. Thomas Maurels Antwort demonstriert einen einfachen Ansatz zum Testen, indem das Objekt als String serialisiert und deseralisiert wird.

    
Unihedron 11.11.2014 14:03
quelle
2

Versuchen Sie JsonTypeInfo Anmerkung zu Ihrer Klasse. Es sollte den Aufruf von serializeWithType() auslösen. Es wird verwendet, um Informationen über den Typ zu speichern, der für polymorphe Typen erforderlich ist, oder um den abstrakten Typ und die passende konkrete Implementierung zu verknüpfen.

    
ragnor 05.11.2014 09:11
quelle