Dit bericht is voor het laatst bewerkt door Summer op 16-1-2019 09:31
1. Wat is het technische probleem dat in dit artikel opgelost moet worden?
Los het probleem op in de stand van de techniek dat bij het parsen van XML-documenten in de C++-taal de basisklassetags die in het oorspronkelijke XML-document voorkomen alleen de basisklassegegevens kunnen parsen volgens het basisklassetype volgens de conventionele parsingmethode, maar de afgeleide klassegegevens niet volledig kunnen ontleden.
2. Technische achtergrond
In de stand van de techniek gebruik je boost::serialization om afgeleide klassen over te zetten met een basisclasspointer of gebruik je BOOST_CLASS_EXPORT macro.
Beide bovenstaande schema's in bestaande technologieën zijn gebaseerd op het abstracte klassenmechanisme, maar omdat abstracte klassen niet kunnen worden geïnstantieerd als concrete objecten die gebruikt kunnen worden, kunnen objecten die als basisklassen in XML-documenten zijn gedeclareerd niet worden geparseerd. De huidige uitvinding is bedoeld om ervoor te zorgen dat de gegevens van zowel het basisklasse-object zelf als het afgeleide klasse-object dat door het basisklasse-object wordt gemarkeerd, correct kunnen worden geanalyseerd en volledig bewaard kunnen blijven.
3. Het technische schema dat in dit artikel wordt gegeven
Dit artikel gebruikt niet het abstracte klassemechanisme, maar introduceert de basisklassepointer in de klasse die door de basisklasse wordt aangeroepen, verklaart de basisklasse-parsingfunctie tot een virtuele functie, en roept de parsingfunctie aan via de basisklassepointer in het parsingproces, zodat polymorfisme dynamisch wordt geanalyseerd en opgeslagen, en tenslotte wordt gegarandeerd dat de data van zowel het basisklasse-object als het afgeleide klasse-object dat van de basisklasse is afgeleid, kunnen worden opgeslagen in de door basis gedefinieerde pointer. Specifieke stappen: Stap 1: C++-code om alle klassen te ontwerpen die kunnen overeenkomen met de datatags in het te parsen XML-document, en ontleed XML-data één voor één vanuit de top-level tags. Stap 2: Bepaal voor elke tag parsed of er andere tags zijn die de tag als basisklasse erven, dat wil zeggen of het tagtype andere tagtypes afleidt; Stap 3: Als wordt vastgesteld dat de huidige tag niet als basisklasse wordt geërfd, parsen dan de huidige tag volgens de normale parsingsstappen. Stap 4: Als wordt vastgesteld dat de huidige tag als basisklasse wordt geërfd, bepaal dan verder of de inhoud die door de basisklassetag wordt beschreven ondergeschikt is aan het basisklasse-object of aan een afgeleid klasse-object; Stap 5: Als de inhoud van de huidige basisklasse-tag wordt bepaald om het basisklasse-object te beschrijven, parsen dan de huidige tag volgens de normale stappen. Stap 6: Als de inhoud van de huidige basisklasse-tag het afgeleide klasseobject beschrijft, pas de code aan om te parsen volgens de nieuwe parsingmethode: pas de datastructuur van het vorige type aan dat het basisklasse-object definieert en definieer in plaats daarvan de basisklassepointer; Wijzig de basisklasse parsingsfunctie en verklaar deze tot een virtuele functie; Stap 7: Waar het basisklasse-object oorspronkelijk voor parsen was gedefinieerd, wordt in plaats daarvan de basisklassepointer gedefinieerd, en wordt het specifieke type geheugen eraan toegewezen volgens het type dat door de labelinhoud wordt beschreven, en wordt de basisclasspointer gebruikt om de parsingfunctie aan te roepen om het huidige label te parsen. Stap 8: Parse en speel de huidige tag om te bepalen of er nog tags zijn die geparsed moeten worden; Stap 9: Als wordt vastgesteld dat er geen tags zijn die moeten worden geparsd, betekent dit dat de parsing is voltooid en de data is opgeslagen in de klasse met het hoogste label van het bijbehorende XML-document in de C++-klasse. Stap 10: Als blijkt dat er nog tags zijn die niet zijn opgelost, parsen dan de volgende tag volgens stap 2.
Stroomdiagram bijgevoegd
4. Samenvatting
C++ introduceert een basisklassepointer om objecten van het bijbehorende type toe te wijzen aan de XML-taginhoud afhankelijk van of het een basisklasse of een afgeleide klasse is, en gebruikt de gedefinieerde basisklassepointer om een parsingfunctie aan te roepen die als een imaginaire functie is gedeclareerd om de inhoud van de XML-basisklasse tag te analyseren. Op deze manier, wanneer de XML-basisklassetag de basisklasse-objectgegevens beschrijft, wordt de basisklasse-parsingfunctie dynamisch aangeroepen volgens het polymorfisme van C++, en kunnen de basisklassegegevens die door de basisklassetag worden beschreven, correct worden geparseerd en behouden. Wanneer de XML-basisklassetag de afgeleide klasseobjectgegevens beschrijft, wordt de afgeleide klasse parsingsfunctie dynamisch aangeroepen volgens het polymorfisme van C++, en kunnen de afgeleide klassegegevens die door de basisklastag worden beschreven, ook correct worden geparseerd en behouden.
|