2014-06-10 3 views
0

그래서 저는 잭슨을 사용하여 객체를 병렬 처리하고 직렬화하려고합니다. 개체는 계층 구조를 가지고 있으며, T는 문자열, 또는 자바 번호 클래스 중 하나 중 하나입니다 깊은 아래로 hierachy에서잭슨의 중첩 제네릭 (Nested Generics)

List<T> 

있다.

일반 목록 디시리얼 라이징은이 포럼에서 공통적 인 주제였으며 mapper.readValue를 사용하여 목록을 비 직렬화 또는 직렬화하는 매퍼를 작성하는 방법을 알고 있습니다.

어떻게 해야할지 모르겠지만 make가 어떻게 해야할지 모르겠지만 최상위 레벨에서 매퍼를 호출하면 명시 적으로 포함 된 클래스의 매개 변수화에 대해 알지 못하므로 매개 변수가있는 목록이 포함 된 최하위 수준 클래스에 도달하면 사용자 지정 디시리얼라이저를 호출합니다.

게터/세터/생성자와 간단한 예는 ommitted :

class A { 
    String name; 
    B thing; 
} 

class B { 
    String command; 
    List<C<?>> conditions; 
} 

class C<T> { 
    String type; 
    List<T> parameters 
} 

그리고 한 가지의를 serialises 잭슨 명령을 쓰고 싶어요. 나는에 부착하는 방법 사용하고 있습니다 :

public String toJSON() throws JsonProcessingException{ 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.enableDefaultTyping(); 
    return mapper.writeValueAsString(this); 
} 

을하지만이 자신의 타입 정보를 손실 제네릭 컬렉션의 알려진 문제를 가지고 deserialisable없는.

here 조언을 사용하여 특정 클래스를 일반 매개 변수로 deserialize 할 수 있지만 이러한 솔루션을 결합하는 방법은 없습니다. Jackson이 C에 대한 사용자 지정 디시리얼라이저를 작성하고 클래스 유형에 도달하면이를 사용할 수 있고 그렇지 않으면 다른 클래스에 대해 정상적으로 작동하는 일반 serialiser를 사용할 수 있기를 바랬습니다. 그 B 필드의 직렬화 복원 할 때

+0

Gson 라이브러리 방식을 사용하려고 시도하십시오. –

+0

@sercan 여러분이 가지고있는 객관적인 증거를 모두 보여주십시오. –

+0

누군가가 Gson에서이 문제에 대한 해결책을 제시하면 기꺼이 그것을 사용할 것입니다. ... 지금은 사용 설명서를 읽지 않았습니다. –

답변

2

잭슨 유형 A의 객체로 JSON 직렬화 복원되고, 다음을보고

List<C<?>> conditions; 

나도 당신 (프로그래머)도 잭슨이 어떤 종류의 Cparameters을 알고 필드가 있어야합니다. 따라서, 사용자가 원하는대로 직렬화 할 정보가 충분하지 않습니다. 대신, 그것은 LinkedHashMap (또는 비슷한 것)이라고 생각하는 기본 유형을 사용합니다.

기본적으로 유일한 힌트는 힌트입니다. (사용자 정의) String 값이 Class 인 객체 계층 구조를 직렬화하여 역 직렬화합니다. 그런 다음 사용자 정의 디시리얼라이저에서 각 유형에 대해 다른 전략을 사용할 수 있습니다.

당신은 단지 몇 가지 유형, String 또는 Number 클래스 중 하나를 가지고 있기 때문에, 당신은 더 좋을 수도 봉사 유형

class C<T> {} 
class StringC extends C<String> {} 
class IntegerC extends C<Integer> {} 

일부를 사용하여 각각에 대한 제네릭 클래스 C 및 X가 아닌 일반 클래스를 작성 polymorphic type handling은 serialize/deserialize 할 수 있습니다.

+0

이것은 효과가있었습니다. 그것은 빠르고 쉽고 거의 추가 작업이 필요하지 않았습니다. :) –