Ten post został ostatnio edytowany przez Summer 16.01.2019 o 09:31
1. Jaki jest problem techniczny, który należy rozwiązać w tym artykule?
Rozwiąż problem w dotychczasowym stanie techniki, że podczas parsowania dokumentów XML w języku C++ tagi klas bazowych pochodzące z oryginalnego dokumentu XML mogą parsować tylko dane klasy bazowej według typu klasy bazowej według konwencjonalnej metody parsowania, ale nie mogą całkowicie przetworzyć danych klas pochodnych.
2. Tło techniczne
W dotychczasowych opracowaniach używaj boost::serialization do przenoszenia klas pochodnych ze wskaźnikiem klasy bazowej lub użyj BOOST_CLASS_EXPORT makra.
Oba powyższe schematy w istniejących technologiach opierają się na mechanizmie abstrakcyjnych klas, ale ponieważ klas abstrakcyjnych nie można instancjonować jako konkretnych obiektów, które można wykorzystać, obiekty deklarowane jako klasy bazowe w dokumentach XML nie mogą być parsowane. Niniejszy wynalazek ma na celu zapewnienie, że dane zarówno obiektu klasy bazowej, jak i obiektu klasy pochodnej oznaczonego przez obiekt klasy bazowej mogą być poprawnie analizowane i całkowicie zachowane.
3. Schemat techniczny przedstawiony w tym artykule
Niniejszy artykuł nie wykorzystuje mechanizmu klas abstrakcyjnych, ale wprowadza wskaźnik klasy bazowej do klasy wywoływanej przez klasę bazową, deklaruje funkcję parsowania klasy bazowej jako funkcję wirtualną i wywołuje funkcję parsowania przez wskaźnik klasy bazowej w procesie parsowania, aby zastosować polimorfizm do dynamicznego parsowania i przechowywania danych, a ostatecznie zapewnia, że dane zarówno obiektu klasy bazowej, jak i obiektu klasy pochodnej pochodzącej z klasy bazowej mogą być przechowywane w wskaźniku klasy bazowej zdefiniowanej. Konkretne kroki: Krok 1: Kod C++ do zaprojektowania wszystkich klas, które mogą odpowiadać tagom danych w dokumencie XML do parsowania, oraz analizowanie danych XML pojedynczo z tagów najwyższego poziomu. Krok 2: Dla każdego analizowanego tagu ustal, czy istnieją inne tagi, które dziedziczą ten tag jako klasę bazową, czyli czy typ tagu wywodzi się z innych typów tagów; Krok 3: Jeśli okaże się, że aktualny tag nie jest dziedziczony jako klasa bazowa, przeanalizuj aktualny tag zgodnie z normalnymi krokami parsowania. Krok 4: Jeśli ustali, że aktualny tag jest dziedziczony jako klasa bazowa, ustal, czy zawartość opisana przez tag klasy bazowej jest podporządkowana obiektowi klasy bazowej lub obiektowi klasy pochodnej; Krok 5: Jeśli zawartość aktualnego tagu klasy bazowej jest określana jako opis obiektu klasy bazowej, przeanalizuj aktualny tag zgodnie z normalnymi krokami. Krok 6: Jeśli obecna zawartość tagu klasy bazowej opisuje obiekt klasy pochodnej, zmodyfikuj kod tak, aby parsował zgodnie z nową metodą parsowania: zmodyfikuj strukturę danych poprzedniego typu definiującego obiekt klasy bazowej i zamiast tego zdefiniuj wskaźnik klasy bazowej; Zmodyfikuj funkcję parsowania klasy bazowej i zadeklaruj ją jako funkcję wirtualną; Krok 7: Gdy obiekt klasy bazowej był pierwotnie zdefiniowany do parsowania, zamiast tego definiuje się wskaźnik klasy bazowej, a konkretny typ pamięci jest mu przypisywany zgodnie z typem opisanym przez zawartość etykiety, a wskaźnik klasy bazowej służy do wywołania funkcji parsowania w celu analizy aktualnej etykiety. Krok 8: Parsuj i odgraj aktualny tag, aby sprawdzić, czy wciąż są tagi do parsowania; Krok 9: Jeśli ustalimy brak tagów do parsowania, oznacza to, że parsowanie zostało zakończone, a dane zapisane do klasy z najwyższą etykietą odpowiadającego dokumentu XML w klasie C++. Krok 10: Jeśli ustalimy jeszcze nierozwiązane tagi, przeanalizuj następny tag zgodnie z krokiem 2.
Załączony schemat przepływowy
4. Podsumowanie
C++ wprowadza wskaźnik klasy bazowej do przypisywania obiektów odpowiedniego typu do treści tagu XML w zależności od tego, czy jest to klasa bazowa, czy pochodna, i wykorzystuje zdefiniowany wskaźnik klasy bazowej do wywołania funkcji parsowania zadeklarowanej jako funkcja urojona do analizy zawartości tagu klasy bazowej XML. W ten sposób, gdy tag klasy bazowej XML opisuje dane obiektu klasy bazowej, funkcja parsowania klasy bazowej jest dynamicznie wywoływana zgodnie z polimorfizmem C++, a dane klasy bazowej opisane przez tag klasy bazowej mogą być poprawnie parsowane i zachowane. Gdy tag klasy bazowej XML opisuje dane obiektu klasy pochodnej, funkcja parsowania klasy pochodnej będzie wywoływana dynamicznie zgodnie z polimorfizmem C++, a dane klasy opisane przez tag klasy bazowej mogą być również poprawnie parsowane i zachowane.
|