Wie kann ich Jackson dazu bringen, in meine eigene Array-Implementierung zu deserialisieren?

8

Wie kann ich Jackson meine eigene Array-Implementierung MyArray<T> nennen, damit es aus einem JSON-Array in MyArray<T> deserialisieren kann? Bis jetzt bekomme ich nur diese Ausnahme:

%Vor%     
tyrondis 03.03.2016, 17:15
quelle

3 Antworten

2

Wie Dariusz bereits erwähnt hat, ist es gut, die Tatsache auszunutzen, dass Array class den Konstruktor akzeptiert, der das normale Array akzeptiert.

Wenn Sie den Standard-Serializer verwenden, sieht Ihr Array nach JSON serialisiert wie folgt aus:

%Vor%

Es ist eindeutig eine Verschwendung von Speicherplatz, es sei denn, Sie möchten, dass die Felder size und ordered beibehalten werden.

Ich schlage vor, dass Sie die Art ändern, wie Sie Ihr Objekt serialisieren, so dass es mehr wie ein normales Array aussieht. Am anderen Ende kann die Deserialisierung Array -Objekt wieder aufbauen.

Wenn Sie das folgende Paar Serializer und Deserializer hinzufügen:

%Vor%

Sie haben eine transparente Konvertierung zwischen diesen Typen

    
Maciej Dobrowolski 08.03.2016, 14:37
quelle
2

Die Array-Klasse von libgdx hat einen Konstruktor, der ein Array akzeptiert: public Array (T[] array) .

Anstatt zu versuchen, das libgdx-Array zu serialisieren, verwenden Sie eine einfache Klasse mit einem Array als Basis für die Serialisierung / Desrialisierung und erstellen dann ein libgdx-Array basierend auf den deserialisierten Daten.

Im Allgemeinen ist es eine gute Regel, nur POJO-artige Objekte zu serialisieren.

Kurz gesagt:

%Vor%     
Dariusz 08.03.2016 13:18
quelle
1

Eine Möglichkeit ist es, einen Serializer wie

zu schreiben %Vor%

Und ein Deserializer wie

%Vor%

Dann beschriften Sie die Eigenschaft, die ein solches Array mit @JsonSerialize(using = MyArraySerializer.class) @JsonDeserialize(using = MyArrayDeserializer.class) enthält.
Wenn Sie Ihre Arrayimplementierung direkt anstelle einer Containerklasse verwenden, enthält diese Seite ein Beispiel zum Registrieren von Serialisierungshandlern zur Laufzeit Ссылка

Ich sollte beachten, dass ich in dieser Antwort die Jackson 1.9 API benutze und die 2.x könnte etwas anders sein. Laut Ссылка sind die auffälligsten Unterschiede die Änderungen in den Paketnamen und wo sich einige Klassen befinden. Ansonsten sollte dieser Code nicht betroffen sein.

    
coladict 08.03.2016 14:35
quelle