Das ist Jackson 2.2.x.
Ich habe eine Klasse, die JsonSerializable
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).
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% 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:
Indem Sie die Klasse mit @JsonTypeInfo
kommentieren, können Sie die Serialisierung mit den Typinformationen angeben:
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.
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.
Tags und Links java serialization jackson json-deserialization