2017-03-14 20 views
0

ジャクソンで一般的なオブジェクトのシリアル化に問題がありました。私は回避策を見つけましたが、私の元の解決策がなぜ機能しないのかまだ分かりません。ここに私のセットアップは次のとおりです。ここでカスタムシリアル化メソッドで汎用オブジェクトをシリアル化するときのJsonMappingException

public class ClassA<P>{ 
    protected final LinkedList<P> list; 

    public ClassA(LinkedList<P> list){ 
     this.list = list; 
    } 
} 

@JsonValue 
public class ClassB extends ClassA<ParamClass>{ 
    public ClassB(LinkedList<ParamClass> list) { 
     super(list); 
    } 

    @JsonCreator 
    public ClassB(int[] array) { 
     this(getList(array)); 
    } 

    public int[] serialize(){ 
     ... 
    } 
} 

public class ParamClass extends BaseParamClass{ 
    public int getInt(){ 
     ... 
    } 
} 

作品Serializeメソッドのための私の現在のコードです:

@JsonValue 
public int[] serialize(){ 
    int[] array = new int[list.size()]; 
    for (int i = 0; i < array.length; i++) { 
     BaseParamClass paramClass = list.get(i); 
     locationsArray[i] = paramClass.getInt(); 
    } 
    return locationsArray; 
} 

そして、ここでは動作するはず何ですが、しません:付き

@JsonValue 
public int[] serialize(){ 
    int[] array = new int[list.size()]; 
    for (int i = 0; i < array.length; i++) { 
     ParamClass paramClass = list.get(i); 
     locationsArray[i] = paramClass.getInt(); 
    } 
    return locationsArray; 
} 

2番目の場合は、この例外が発生します。

com.fasterxml.jackson.databind.JsonMappingException(packages.BaseParamClass cannot be cast to another.packages.ParamClass) 

この原因は何ですか? ClassBの型指定から、リスト内でBaseParamClassではなくParamClassだけが使用できることは明らかです。私は何かが恋しいですか?

答えて

0

あなたはジャクソンのObjectMapperターゲットクラスのジェネリック型伝える必要があります:

ObjectMapper mapper = new ObjectMapper(); 
TypeFactory factory = mapper.getTypeFactory(); 
JavaType paramClassType = factory.constructType(ParamClass.class); 
JavaType classBType = factory.constructSimpleType(ClassB.class, new JavaType[]{paramClassType}); 
mapper.readValue(src, classBType); 
+0

申し訳ありませんが、私はあなたのコードと私の質問の間に何らかの関係が表示されません。例外はシリアル化中に発生し、デシリアライズ中には発生しません。また、**私は他のソリューションについて知っている**(私の質問では、作業の解決策を参照してください)、私は私の最初の解決策が動作しない理由を知りたい。 – Fido

関連する問題