2011-08-31 4 views
0

XML을 직렬화하는 일련의 C++ 클래스가 있습니다. 멋지고 멋쟁이. XML 스트림에서 동일한 클래스를 초기화하기 위해 deserialize 루틴이 필요합니다.C++에서의 XML 직렬화/직렬화

나에게 명확하지 않은 점은 expat 또는 tinyXML을 사용하여 XML 스트림을 구문 분석하는 방법인데, 스트림 파서는 XML을 사용하여 인스턴스를 사용하여 초기화 할 XML을 확인합니다.

이것은 전통적으로 어떻게 이루어 졌습니까? XML 파일을 구문 분석하고 XML이 파싱 될 때 적절한 클래스를 만드는 것은 정말 쉽지만 멤버 함수를 역 직렬화하면 어떻게 생겼을까요? 레자

+1

나는 "전통적으로"에 대해 모른다. 그러나 공장 *이 떠오른다. –

답변

0

귀하의 직렬화 형식은 객체의 클래스를 나타내는 요소를 포함해야

덕분에 연재되고. 예를 들어, 당신이 가진 개체를 직렬화 각 XML을 시작할 수 :

<object> 
    <class>ClassName</class> 
    ... object data here 
</object> 

이는 C의 각 ++ 클래스는 XML에 쓸 수있는 고유 한 문자열 이름을 부여해야한다는 것을 의미합니다.

어떤 XML 파서를 사용하든 상관 없습니다. deserialize 함수는 클래스 이름을 읽고이를 실제 클래스에 매핑해야합니다. 가장 단순한 형태로 이것은 if 문의 긴 체인에서 수행 될 수 있지만 물론 원한다면 더 정교한 메커니즘을 생각해 낼 수 있습니다. 클래스를 알면 빈 인스턴스를 만들고 모든 클래스가 기본 클래스에서 상속 받았다고 가정하면 fromXML() 가상 함수를 호출하여 기본 클래스에서 순수 가상이며 모든 하위 클래스에 구현됩니다. fromXML() 메서드는 나머지 XML 트리를 구문 분석하고 XML 트리에서 읽은 데이터에 따라 개체 인스턴스를 초기화합니다.

0

클래스를 XML로 직렬화 할 때 각 노드에는 런타임 유형에 대한 식별자가 있어야합니다. 비 직렬화의 경우 이러한 유형 식별자를 각 유형의 팩토리 함수에 매핑하는 std::unordered_map을 작성하십시오. 이렇게하려면 팩토리 함수가 동일한 시그니처를 가져야하므로 공통 인터페이스에서 모든 직렬화 가능 클래스를 파생해야합니다. 유형 식별자에 따라 런타임에 팩토리 함수의 반환 값을 내 보냅니다. setter/getter를 작성하여 특정 노드 유형이 가질 수있는 각 속성 및 값에 액세스하십시오.

DOM 파서를 사용하는 경우 노드에 대한 모든 정보가 있으므로 DOM 파서를 사용하는 것이 쉽지 않을 수 있습니다.

SAX 파서를 사용하면 하위 노드 클래스를 만들고 각 노드에 대해 노드마다 값을 & 값으로 설정해야합니다. XML 파서는 XML 파일을 읽을 때 새로운 속성 인 &을 알리기 위해 재정의 할 수있는 콜백 또는 가상 메소드를 허용해야합니다.


돈을 쓰는 데 신경 쓰지 않는다면 다른 사람이 내게 맡길 수있는 쉬운 방법이 있습니다. 나는 Code Synthesis XSD을 사용한 적이 없지만 정확하게하려는 것을 위해 설계되었습니다.