2014-03-25 2 views
1

Java 객체의 트리를 상상해보십시오. 즉, 기본적으로 정수와 같은 기본 유형에 도달 할 때까지 다른 클래스의 객체 인 속성을 포함하는 일부 클래스의 최상위 객체를 상상해보십시오 또는 문자열 등 예를 들어Java 객체의 트리를 사용자 정의 XML로 직렬화

class Car { 
    private Door _leftDoor; 
    private Door _rightDoor; 
} 

class Door { 
    private String _name; 
} 

클래스 Car의 최상위 객체를 직렬화함으로써,이 같은 예를 들어, XML 문서를보고 싶다 : 그런데

<object type="Car"> 
    <property type="Door" identifier="_leftDoor"> 
    <object type="Door"> 
     <property type="String" identifier="_name">I am a left door!</property> 
    </object> 
    </property> 
    <property type="Door" identifier="_rightDoor"> 
    <object type="Door"> 
     <property type="String" identifier="_name">I am a right door!</property> 
    </object> 
    </property> 
</object> 

을 이 조각이 어떻게 될 수 있는지 주목해라. 예를 들어 Car 오브젝트가 다른 상위 오브젝트의 특성 인 경우와 같이 다른 계층 구조로 구분됩니다.

내 질문은 :이 을 패터닝, structurewise, designwise, architecturewise 을 구현하는 올바른 방법 일 것입니다 무슨? 내 질문에 약간의 설명이 필요하다고 생각합니다. 내 마음에 오는이를 구현하는 첫 번째 간단한 방법은 자바의 기존 toString 비슷한입니다

class Car { 
    ... 

    public Element toElement(Element element) { 
    Document document = element.getOwnerDocument(); 
    Attr attr; 

    Element objectElement = document.createElement("object"); 
    element.appendChild(objectElement); 

    attr = document.createAttribute("type"); 
    attr.setValue(class.getSimpleName()); 
    objectElement.setAttributeNode(attr); 

    Element propertyElement; 

    propertyElement = document.createElement("property"); 
    objectElement.appendChild(propertyElement); 

    attr = document.createAttribute("type"); 
    attr.setValue(_leftDoor.getClass().getSimpleName()); 
    propertyElement.setAttributeNode(attr); 

    attr = document.createAttribute("identifier"); 
    attr.setValue("_leftDoor"); 
    propertyElement.setAttributeNode(attr); 

    _leftDoor.toElement(propertyElement); 

    propertyElement = document.createElement("property"); 
    objectElement.appendChild(propertyElement); 

    attr = document.createAttribute("type"); 
    attr.setValue(_rightDoor.getClass().getSimpleName()); 
    propertyElement.setAttributeNode(attr); 

    attr = document.createAttribute("identifier"); 
    attr.setValue("_rightDoor"); 
    propertyElement.setAttributeNode(attr); 

    _rightDoor.toElement(propertyElement); 

    return objectElement; 
    } 
} 

class Door { 
    ... 

    public Element toElement(Element element) { 
    ... 
    } 
} 

어떻게 좋은 직접 클래스를 대응하는 방법으로 XML 직렬화의이 종류를 추가하는 의미에서이 아이디어? 매개 변수로 Element을 사용하도록 제한 한 것이 좋습니까 (Java XML API가 설계된 방식 때문에 강제로 수행 할 수 있습니다). 내가 돌아 오는 것이 좋다 Element? 이 구현에서 아키텍처 관점에서 개선 할 수있는 아이디어가 있습니까? 어떤 조언을 환영합니다.

나는 java.beans.XMLEncoder 시설을 알고 있지만이 경우 Java 특정 XML 시리얼 라이저이며이 경우에는 나를 위해 중복됩니다.

답변

2

XStream과 같은 것을 사용하지 않는 이유는 무엇입니까? 적용 할 수없는 경우 리플렉션 API를 사용하여 XML을 생성하는 코드를 별도로 유지할 수 있도록 제안 할 것입니다. 아마도 각 클래스에 대해 특정 XML 직렬화 코드를 작성하는 대신 작업을 수행하는 리플렉션을 사용하여 일반 메소드를 작성할 수 있습니다. 필요한 경우 사용자 지정 주석을 사용하여 클래스 내에서보다 세부적인 동작을 지정할 수 있습니다. 그러나 XStream과 같은 것이 아마도 당신에게 많은 것을 할 수 있기 때문에 바퀴를 다시 발명하는 것처럼 느껴집니다.

+0

XStream은 순수한 XML 마샬링/언 마샬링이라는 매우 흥미로운 소프트웨어입니다. 나는 또한 JAXB가 Java SE와 함께 번들로 제공된다는 사실을 알게되었고, 이제는 JAXB도 JAXB를 대신 할 수있는 또 다른 대안이되었습니다! ** [JAXB와 XStream의 차이점은 무엇입니까?] (http://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-xstream.html) ** 기사는 . 나는 어쨌든 바퀴 재 탄생 팬이 아니기 때문에 내가 달성하고 싶은 것에이 방법을 어떻게 든 적용 할 수있을 것이라고 생각한다. 그래서 이것을 지적 해 주셔서 고맙습니다. 저는 누군가가 이미 저보다 훨씬 잘 해냈다는 것을 알았습니다. –