2009-04-08 4 views
3

RESTful 웹 서비스를 개발 중입니다.부분 빈 직렬화 및 직렬화 해제 + 병합

나는 많은 엔티티 클래스 (주로 JPA 엔티티뿐만 아니라 다른 bean)를 가지고있다.

객체 매핑, 직렬화, 바인딩 및 기타 라이브러리가 있습니다.

직렬화가 게터뿐만 아니라 객체 필드를 사용하여 지원해야한다

  • XML로 엔티티를 직렬화 및 JSON : 나는 나를있게 한 찾고 있어요.

    반드시 보기을 지원해야합니다. 뷰를 통해 직렬화 할 엔터티의 속성 하위 집합을 지정하는 방법을 의미합니다. 예를 들어 Yahoo!의 Retrieving Partial Resources을 참조하십시오. 소셜 플랫폼 API. 나는 또한 그것이 무한히 반복적으로 반복되는 것을 원하지 않는다. :

    뷰는 a) 엔티티에서 노출 될 속성과 b) 엔티티 자체 인 경우 각 뷰를 정의해야한다.

    예를 들어, 엔터티 Personfullsimple보기를 가질 수 있습니다. simple 뷰에 Person을 요청하면 id, firstNamelastName 속성 만 일련 화됩니다. full보기를 요청할 때 motherfather (자체는 Persons) 속성도 일련 번호가 지정되지만 simple보기만으로 (따라서 조부모에게 재귀되지는 않음) 표시됩니다.

    JSON 직렬화는 "자연스러운"이어야합니다. 즉, Javascript에서 의미가있는 것입니다. 즉, 적절한 정수, 부울 및 null을 원하며 XML 인포 셋 전체를 캡처하려고하는 추가 객체 래퍼 또는 무언가가 필요하지 않습니다.

    XML의 경우,하지 XML 스키마의 xsi:nil="true" 속성이 널 (null)을 직렬화빈 요소를 사용하는 직렬화를 구성 할 수 있어야한다.

    • 불확정 friends 속성 (도면에 없음) :

      또한

      , 어레이는 특정 뷰에 존재하지 않는 빈 어레이 및 특성을 구별하는 것이 가능하므로 중첩 된 요소를 사용하여 직렬화되어야

      <person> 
          <friends></friends> 
      </person> 
      
    • 0 :

      <person> 
      </person> 
      
    • 빈 배열, 사람은 어떤 친구가 없습니다

  • 역 직렬화 된 XML 및 JSON과 기존의 기관

    에 데이터를 병합 지금이 어려운 부분이다.다음 두 개가 연결됩니다.

    부분 객체 (뷰와 유사하지만 어떤 속성이 있는지는 미리 정의되지 않음)이 연결되어야합니다.

    을 기존 속성에 병합하고 새 속성을 생성하지 않습니다.

    설명하는 것이 약간 까다 롭습니다. 대부분의 라이브러리는 Java 객체로 직렬화되지만 그 당시에는 정의되지 않은 속성과 null/empty 속성 (Javascript/JSON, 위에서 설명한 XML, PHP 등 ...) 사이의 구분이 손실됩니다. ,

    person.setLastName("Bon Jovi"); 
    person.setFriends(new ArrayList()); 
    

    그것은이 fatherfirstName 및/또는 명확한 실체를 만지지해야 라이브러리가해야

    <person> 
        <lastName>Bon Jovi</lastName> 
        <friends></friends> 
    </person> 
    

    Person 객체를 전달되는 :

    이 때이 XML을 부여하고 예를 들면.

    물론 목록을 보면 더 복잡해야합니다. 중첩 된 엔티티를 업데이트할지 아니면 새 엔티티를 생성 할지를 결정할 수있는 id 속성을 구성해야합니다.

    이 업데이트/패치는 라이브러리가 DTO를 반환하지 않아야하는 이유입니다. 그 당시 null은 "설정 해제"또는 "아무 것도하지 않음"을 의미 할 수 있습니다.

글쎄, 그게 전부 야. 나는 반드시 "많이 (MUST)"많이 말했고, 나는 지금 깨닫는다. 라이브러리는 실제로 그것을 제공 할 필요는 없지만, 깨끗한 방식으로 기능을 추가 할 수있는 방법이 있어야한다. (모든 것을 다시 쓰는 방식으로는 안된다. 더 쉽게).

답변

1

난 당신이 뭔가를 구현하기 위해 필요 해요 가정, 당신이 필요로하는 모든 것을 할 기존 라이브러리로 알고 있지만하지 않습니다 빈 속성에 따라

  • 쓰기 XML 또는 JSON은 매우 간단하다 :

    • 모든 속성 값 (http://commons.apache.org/beanutils/)을 얻으려면 Apache Commons BeanUtils를 사용하십시오. 특히 PropertyUtils 클래스.
    • 반복적으로 BeanUtils를 사용하여 전체 개체 그래프를 걷습니다.주기를주의하십시오. 이미 보았던 것을 추적하기 위해 Set 또는 측면이 필요합니다.
    • XML : XMLEncoder보세요 - 작동합니다 독서를 들어 XML
  • 을 만들 자바 빈즈 속성을 사용하여 : 한 가지 방법은 다음 객체 사이의 속성을 병합 처리 객체를 생성 (JSON 또는 XML에 대한) 기존 libs와 사용할 수 있습니다. XMLDecoder 클래스는 Bean XML을 읽을 수 있습니다 (XMLEncoder를 사용하여 작성한다고 가정). 이 방법의 까다로운 부분은 값이 "set"되었을 때를 null에 대해서는 XML에 설정하지 않았는지를 아는 것입니다. 이 접근법은 새로운 객체들을 생성하는 추가 오버 헤드를 가지고 있습니다.

  • 그렇지 않으면, JSON 또는 XML을 읽는 것은 조금 까다 롭습니다,하지만 너무 나쁜

    • 난 당신이 이미에 병합 할 객체를 색인의 일부 수단이 가정 (일종의지도 등)
    • 어떤 속성이 개체를 고유하게 식별하는 키인지 알 수있는 방법이 있다고 가정합니다. 잘못된 키를 만들므로 성을 가로 지르는 것입니다.
    • XML :이 경우 사용 유형, XML 용 SAX 판독기 권장 - 데이터를 추가 할 개체를 추적하기 위해 스택이 필요합니다. ~. SAX 판독기는 표시되는 태그를 알려주고 해당 태그의 값을 제공합니다. 좀 더 빠른 경향이있는 XML pull을 사용할 수도 있습니다.
    • JSON : 오픈 소스 JSON 라이브러리 중 일부를 살펴보고 몇 가지 조정을 해보십시오. JSON은 구문 분석하기가 매우 간단하며 이러한 도구는 꽤 작아서 큰 문제는 아닙니다. 또는 ANTLR (또는 다른 생성기) 파서를 작성하여 JSON을 읽고 원하는대로 처리 할 수 ​​있습니다. 그것은 가치가 무엇인지에 대한
1

, Jackson 부분 업데이트가 아웃 - 오브 - 박스 : JSON으로 직렬화 다시 읽기에

ObjectMapper mapper = new ObjectMapper(); 
Bean existing = ...; 
mapper.updatingReader(existing).readValue(jsonSource); 

과도 호환 형식을 변환 할 수 있습니다 (유사 다른 유형으로).

XML 부분에서는 JAXB를 사용할 수 있습니다.하지만 알고있는 한 바인딩 만 완료 할 수 있습니다.

관련 문제