2012-08-25 4 views
0

나는 Hibernate3을 사용하여 다음 코드를 가지고있다.Jackson Json은 여러 개의 Hibernate 객체를 직렬화했다.

List queryResult = session.createQuery("SELECT A, B from A, B where A.id = B.id"); 
for (Object o: queryResult) { 
    Object[] array = (Objec[]) o; 
    A a = (A) array[0]; 
    B b = (B) array[1]; 
    //do work 
} 

최대 절전 모드 쿼리 결과에서 직접 작동하므로 정상적으로 작동합니다. 그러나 queryResult를 문자열로 serialize하여 나중에 사용할 수 있도록하려고합니다. 나는 다음과 같은 사용 잭슨의 JSON 라이브러리 시도 : 나는 문제를 쳤을 때 내가 읽고 쿼리 결과를 최대 절전 모드로 다시 JSON에서 문자열을 역 직렬화 할 나중에 그런

ObjectMapper m = new ObjectMapper() 
final String queryResultString = m.writeValueAsString(queryResult); 

, 즉이다. 읽기 코드 :

List r = m.readValue(queryResultString, List.class); 
for (Object o: r) { 
    Object[] array = (Objec[]) o; 
    A a = (A) array[0]; 
    B b = (B) array[1]; 
    //do work 
} 

Object []이 (가) 불평하는 캐스트가 객체 배열에 대한 ArrayList를 캐스팅 할 수 없습니다.

나는 Jackson Hibernate 모듈을 사용하려고 시도했지만, 그 역시 도움이되지 못했습니다. 그래서 내 질문은 : a) JSon 직렬화로 이것을 수행하는 올바른 방법은 무엇입니까? b) 잭슨은 그것을 왜 군대에게 비 직렬화 하는가?

답변

0

가정

목록은 유사합니다 때 직렬화 잭슨 : [[A_item, B_item], [A_item2, B_item2], ... [A_itemn, B_itemn] 이유는 무엇입니까? 원하는 경우 목록 또는 배열 배열 목록이 있으므로 (두 번째 목록에는 항상 A와 B의 두 요소가 있습니다).

문제

귀하의 목록에 지정되지 않은 것입니다. 따라서 잭슨은 json 스트림을 목록 목록으로 deseriliaze합니다. 잭슨이 배열 구조체를 만나고 그것을 직렬화 할 유형을 모르는 경우에는 배열이 아닌 목록으로 직렬화가 해제됩니다. 대신 당신이 목록을 사용하여 배열을 사용

솔루션

1), 잭슨 윌 기본 목록에 직렬화가 아닌 배열 (기준 그게 당신)는 classcast 예외를 이유.

2) 이하인 경우 java 5+ (이는 generics를 사용할 수 있음을 의미 함), 그러면 jackson TypeReference 클래스를 사용할 수 있습니다.

List listOfLists = mapper.readValue(queryResultString, new TypeReference<List<Object[]>>() {}); 

3) 당신은 Genson http://code.google.com/p/genson/ 잭슨 전환하는 것입니다 기본 배열 직렬화가 아닌 목록에 의해. Genson은 잭슨이 가지고 있지 않은 다른 많은 좋은 기능을 제공합니다. 위키를 보시길. http://code.google.com/p/genson/wiki/GettingStarted. Genson은 java 6+이 필요합니다. 당신은 foreach 루프를 HAVA

List r = new Genson().deserialize(queryResultString, List.class); 
for (Object o: r) { 
Object[] array = (Objec[]) o; 
    // it works! 
    A a = (A) array[0]; 
} 

편집, 나는 다음 Genson로 전환 6+ 당신은 자바 미만 결론;

+0

2) 작동하지 않습니다) - 그것은 [개체를 통과 않았다 ] casting 문을 사용하지만 객체 (A) 배열 [0]의 실제 캐스팅이 예외로 실패했습니다. LinkedHashMap을 A로 캐스팅 할 수 없습니다. 3) Genson이 작동하지 않았습니다. A : –

+0

을 직렬화하지 못했습니다. 1) A 및 B는 복잡한 유형입니다. Jackson은 기본적으로 어떤 형식으로 deserialize할지 모릅니다. 그게 그가지도로 비 순차 화 된 이유입니다.2) 당신의 오브제가 어떻게 생겼는지 보여줄 수 있습니까? 직렬화가 실패하는 것에 대해 매우 놀랐습니다 ... – eugen

+0

A와 B는 최대 절전 모드 개체입니다. 즉, 최대 절전 모드를 사용하여 mysql을 쿼리하여 반환 된 개체입니다. 직렬화가 클래스 정보를 잃어 버릴 수도 있다고 생각하고 객체 mappper에 대해 hibernateModule을 추가하려고 시도했지만 작동하지 않았습니다. –

관련 문제