Dette indlæg blev sidst redigeret af Summer den 16-1-2019 kl. 09:31
1. Hvad er det tekniske problem, der skal løses i denne artikel?
Løs problemet i den tidligere teknik, at når man parser XML-dokumenter i C++-sproget, kan basisklasse-tags afledte klassedata, der optræder i det oprindelige XML-dokument, kun parse basisklassedataene efter basisklassetypen ifølge den konventionelle parsingmetode, men kan ikke fuldstændigt parse de afledte klassedata.
2. Teknisk baggrund
I tidligere teknik kan man bruge boost::serialization til at overføre afledte klasser med en base-klassepointer eller bruge BOOST_CLASS_EXPORT makro.
Begge ovenstående skemaer i eksisterende teknologier er baseret på den abstrakte klassemekanisme, men da abstrakte klasser ikke kan instansieres som konkrete objekter, der kan bruges, kan objekter deklareret som basisklasser i XML-dokumenter ikke parses. Den foreliggende opfindelse har til formål at sikre, at dataene fra både basisklasseobjektet selv og det afledte klasseobjekt, der er markeret af basisklasseobjektet, kan parses korrekt og fuldstændigt bevares.
3. Det tekniske skema, der gives i denne artikel
Denne artikel bruger ikke den abstrakte klassemekanisme, men introducerer baseklassepointeren i den klasse, der kaldes af baseklassen, erklærer basisklasse-parsingfunktionen som en virtuel funktion og kalder parsing-funktionen gennem baseklasse-pointeren i parsing-processen, for at anvende polymorfi til dynamisk parsning og lagring af dataene, og sikrer endelig, at dataene fra både baseklasseobjektet og det afledte klasseobjekt, der stammer fra baseklassen, kan gemmes i baseklasse-definerede pointer. Specifikke trin: Trin 1: C++-kode til at designe alle klasser, der kan svare til datatags i XML-dokumentet, der skal parses, og parse XML-data én ad gangen fra topniveau-tags. Trin 2: For hver tag-parsed, afgør om der er andre tags, der arver tagget som en baseklasse, dvs. om tag-typen afleder andre tag-typer; Trin 3: Hvis det fastslås, at det nuværende tag ikke arves som baseklasse, skal det aktuelle tag parses efter de normale parsing-trin. Trin 4: Hvis det fastslås, at det aktuelle tag arves som en baseklasse, skal yderligere afgøres, om indholdet beskrevet af baseklassetagget er underordnet basisklasseobjektet eller et afledt klasseobjekt; Trin 5: Hvis indholdet af det aktuelle baseklasse-tag bestemmes til at beskrive basisklasseobjektet, parser det aktuelle tag efter de normale trin. Trin 6: Hvis indholdet af det aktuelle baseklasse-tag beskriver det afledte klasseobjekt, modificerer koden til at parse i henhold til den nye parsing-metode: ændr datastrukturen for den tidligere type, der definerer baseklasseobjektet, og definer i stedet baseklasse-pointeren; Modificerer basisklasse-parsingfunktionen og erklærer den som en virtuel funktion; Trin 7: Hvor baseklasseobjektet oprindeligt blev defineret til parsing, defineres baseklassepointeren i stedet, og den specifikke type hukommelse tildeles den i henhold til den type, der beskrives af labelindholdet, og baseklassepointeren bruges til at kalde parsing-funktionen for at parse den aktuelle label. Trin 8: Parse og spil den aktuelle tag for at afgøre, om der stadig er tags, der skal parses; Trin 9: Hvis det fastslås, at der ikke er tags, der skal parses, betyder det, at parsingen er afsluttet, og at dataene er gemt i klassen med den højeste label i det tilsvarende XML-dokument i C++-klassen. Trin 10: Hvis det fastslås, at der stadig er tags, der ikke er løst, parser du det næste tag i henhold til trin 2.
Flowdiagram vedhæftet
4. Resumé
C++ introducerer en baseklasse-pointer til at tildele objekter af den tilsvarende type til XML-tag-indholdet afhængigt af, om det er en baseklasse eller en afledt klasse, og bruger den definerede baseklasse-pointer til at kalde en parsing-funktion erklæret som en imaginær funktion til at parse XML-baseklasse-tagindholdet. På denne måde, når XML-baseklassetagget beskriver baseklasseobjektdataene, vil basisklasseparsingsfunktionen blive kaldt dynamisk i henhold til polymorfien af C++, og basisklassedataene, der beskrives af baseklassetaget, kan parses korrekt og bevares. Når XML-baseklassetagget beskriver de afledte klasseobjektdata, vil den afledte klasseparsingsfunktion blive kaldt dynamisk i henhold til polymorfien af C++, og de afledte klassedata, der beskrives af basisklassetagget, kan også korrekt parses og bevares.
|