이 게시물은 2019-1-16 09:31에 Summer가 마지막으로 편집했습니다
1. 이 글에서 해결해야 할 기술적 문제는 무엇인가요?
기존 기술에서 문제를 해결하자면, C++ 언어로 XML 문서를 파싱할 때, 원본 XML 문서에 나타나는 기본 클래스 태그 파생 클래스 데이터는 기존 파싱 방법에 따른 기본 클래스 타입에 따라서만 파싱할 수 있지만, 파생 클래스 데이터는 완전히 파싱할 수 없다는 점입니다.
2. 기술 배경
기존의 기술에서는 boost::serialization을 사용해 기본 클래스 포인터로 파생 클래스를 전송하거나 매크로BOOST_CLASS_EXPORT 사용하세요.
기존 기술에서 위의 두 방식 모두 추상 클래스 메커니즘에 기반하지만, 추상 클래스는 구체적인 객체로 인스턴스화할 수 없기 때문에 XML 문서에서 기본 클래스로 선언된 객체는 파싱할 수 없습니다. 본 발명은 기본 클래스 객체 자체와 그 객체에 의해 표시된 파생 클래스 객체의 데이터가 올바르게 파싱되고 완전히 보존될 수 있도록 보장하는 것을 목적으로 합니다.
3. 이 문서에서 제공하는 기술 체계
본 논문은 추상 클래스 메커니즘을 사용하지 않고, 기본 클래스가 호출한 클래스에 기본 클래스 포인터를 도입하고, 기본 클래스 파싱 함수를 가상 함수로 선언하며, 파싱 과정에서 기본 클래스 포인터를 통해 파싱 함수를 호출하여 다형성을 적용하여 데이터를 동적으로 파싱하고 저장하고, 최종적으로 기본 클래스 객체와 그 클래스에서 파생된 파생 클래스 객체의 데이터가 기본 클래스 정의된 포인터에 저장될 수 있도록 보장합니다. 구체적인 단계: 1단계: C++ 코드로 파싱할 XML 문서의 데이터 태그에 대응할 수 있는 모든 클래스를 설계하고, 최상위 태그에서 XML 데이터를 하나씩 파싱합니다. 2단계: 각 파싱된 태그에 대해, 그 태그를 기본 클래스로 상속하는 다른 태그가 있는지 판단합니다. 즉, 태그 타입이 다른 타입을 파생시키는지 여부입니다; 3단계: 현재 태그가 기본 클래스로 상속되지 않은 것으로 판단되면, 일반적인 파싱 단계에 따라 현재 태그를 파싱합니다. 4단계: 현재 태그가 기본 클래스로 상속된 것으로 판단되면, 기본 클래스 태그가 설명하는 내용이 기본 클래스 객체에 종속적인지 파생 클래스 객체에 종속적인지 추가 확인; 5단계: 현재 기본 클래스 태그의 내용이 기본 클래스 객체를 설명하는 것으로 판단되면, 일반적인 단계에 따라 현재 태그를 파싱합니다. 6단계: 현재 기본 클래스 태그 내용이 파생 클래스 객체를 설명하고 있다면, 새로운 파싱 방법에 따라 코드를 파싱하도록 수정하세요: 이전 타입의 기본 클래스 객체를 정의한 데이터 구조를 수정하고 대신 기본 클래스 포인터를 정의합니다; 기본 클래스 파싱 함수를 수정하고 이를 가상 함수로 선언하세요; 7단계: 원래 파싱용으로 정의된 기본 클래스 객체는 대신 기본 클래스 포인터를 정의하고, 라벨 내용에 따라 특정 메모리 유형을 할당하며, 기본 클래스 포인터를 사용해 현재 라벨을 파싱하는 파싱 함수를 호출합니다. 8단계: 현재 태그를 파싱하고 재생하여 아직 파싱할 태그가 있는지 확인합니다; 9단계: 파싱할 태그가 없다고 판단되면, 파싱이 완료되어 데이터가 C++ 클래스에서 해당 XML 문서의 가장 높은 라벨을 가진 클래스에 저장되었음을 의미합니다. 10단계: 아직 해결되지 않은 태그가 있다고 판단되면 2단계에 따라 다음 태그를 파싱합니다.
플로우차트 첨부
4. 요약
C++는 기본 클래스 포인터를 도입하여 해당 타입의 객체를 XML 태그 콘텐츠에 할당하고, 정의된 기본 클래스 포인터를 사용해 가상의 함수로 선언된 파싱 함수를 호출하여 XML 기본 클래스 태그 내용을 파싱합니다. 이렇게 하면 XML 기본 클래스 태그가 기본 클래스 객체 데이터를 설명할 때, C++의 다형성에 따라 기본 클래스 파싱 함수가 동적으로 호출되고, 기본 클래스 태그로 설명된 기본 클래스 데이터는 올바르게 파싱되고 보존될 수 있습니다. XML 기본 클래스 태그가 파생 클래스 객체 데이터를 설명할 때, C++의 다형성에 따라 파생 클래스 파싱 함수가 동적으로 호출되며, 기본 클래스 태그로 설명된 파생 클래스 데이터도 올바르게 파싱 및 보존될 수 있습니다.
|