2017-03-14 1 views
0

Jackson에서 일반 객체를 직렬화하는 데 문제가 있습니다. 해결 방법을 찾았지만 원래 솔루션이 작동하지 않는 이유는 아직도 모르겠습니다. 여기 내 설정이다 :JsonMappingException 사용자 정의 직렬화 메소드로 일반 객체를 직렬화 할 때

@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; 
} 

을 여기

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(){ 
     ... 
    } 
} 

작동 직렬화 방법에 대한 내 현재 코드입니다 두 번째 경우에는 예외가 발생합니다.

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