Norint išvengti tokių problemų kaip „Stack Overflow“ išimtys ar duomenų nenuoseklumai, reikia atidžiai apsvarstyti, kaip tvarkyti rekursines nuorodas ar apskritas nuorodas. Čia yra keletas geriausių šių nuorodų tvarkymo praktikų:
Apvalaus nuorodų supratimas
Apskritimo nuorodos atsiranda tada, kai objektas nurodo kitą objektą, kuris, savo ruožtu, nurodo pirmąjį objektą, sukuriantį kilpą. Tai gali sukelti problemų JSON serializacijos metu, nes tai sukelia begalinę rekursiją.
Apsauginių nuorodų tvarkymo metodai
1. Venkite žiedinių nuorodų **
Geriausia praktika yra visiškai išvengti žiedinių nuorodų, restruktūrizuojant savo duomenų modelį. Tačiau tai ne visada įmanoma, ypač kalbant apie sudėtingus objektų ryšius.
2. Unikalių identifikatorių naudojimas **
Viena veiksminga strategija yra sulaužyti žiedinę nuorodą, pakeičiant ją unikaliu identifikatoriumi ar surogatiniu raktu. Tai apima kiekvieno objekto nuoseklumą vieną kartą ir naudojant nuorodą (pvz., ID) vėlesniems įvykiams. Šis metodas užtikrina, kad kiekvienas objektas būtų serijuojamas tik vieną kartą, sumažindamas duomenų dubliavimąsi ir pagerinant efektyvumą.
3. Referenceloophandling in json.net **
JSON.NET pateikia parinktį „referenceloophandling“, kurią galima nustatyti kaip „seriale“ arba „ignoruoti“. „Serialize“ parinktis serijuoja visą objekto diagramą, naudodama nuorodas į vėlesnius įvykius, kurie tiksliai išsaugo žiedines nuorodas be dubliavimosi. „Ignoruoti“ parinktis supaprastina nuoseklumą, neįtraukiant apskrito nuorodų, tačiau gali sukelti duomenų nenuoseklumą ir dubliavimąsi.
4
JSON.NET taip pat palaiko „PreservereferenCeshandling“, kuris prideda „$ id“ ypatybę prie kiekvieno nuoseklaus objekto. Vėlesnės nuorodos į tą patį objektą yra pavaizduotos kaip „$ ref“ ypatybės, nurodančios originalų „$ id“. Šis metodas efektyviai tvarko apskritas nuorodas, išvengdamas nereikalingo to paties objekto serializacijos.
5. System.Text.json informationHandler **
„.NET“ „System.Text.json“ nuosavybėje galite naudoti „referencalhandler“ objekto nuorodų išsaugojimą. Nustatant jį į „Retternhandler.Preserve“, galima tvarkyti žiedines nuorodas, pridedant metaduomenis, kad sektų nuorodas, panašiai kaip JSON.NET požiūris.
6. Individualus serialas **
Scenarijuose, kuriems netaikomi įmontuoti nustatymai, galite sukurti pasirinktinius keitiklius ar tvarkykles. Tai apima logikos įgyvendinimą, skirtą sekti ir išspręsti nuorodas rankiniu būdu, suteikti lankstumo sudėtingiems ar konkrečiems naudojimo atvejams.
7. Apskritų nuorodų ignoravimas **
Jei apskrito nuorodų išsaugojimas nėra būtinas, galite jų nepaisyti naudodami tokius anotacijas kaip „@jsonignore“ Džeksone ar panašiuose mechanizmuose kitose bibliotekose. Šis požiūris supaprastina serializaciją, tačiau gali sukelti neišsamių duomenų vaizdavimą.
tinkamo požiūrio pasirinkimas
Metodo pasirinkimas priklauso nuo konkrečių reikalavimų ir veiklos aspektų:
- Duomenų vientisumas: Jei išsaugoti visą objekto diagramą yra labai svarbu, naudokite tokius metodus kaip „referenceloophandling.serialize“ arba „referenceHandler.Preserve“.
- Efektyvumas: jei sumažinimas duomenų dydis ir vengimas dubliavimosi yra prioritetai, naudokite unikalius identifikatorius ar nuorodas.
- Paprastumas: Jei apskrito nuorodos nėra kritinės, jų ignoravimas gali būti paprasčiausias sprendimas.
Galų gale, norint iš tikrųjų tvarkyti žiedines nuorodas, reikia suprasti duomenų vientisumo, efektyvumo ir paprastumo kompromisus.
Citatos:[1] https://github.com/dotnet/corefx/issues/40045
[2] https://www.Linkedin.com/pulse/efficfict Handling-circular-references-json-breaking-power-pawar
[3] https://www.reddit.com/r/unity3d/comments/gjvv2n/json_serializing_of_recurssive_class/
[4] https://infinum.com/handbook/dotnet/best-praktices/json-serialization-and-deserialization
[5] https://softwareEngineering.stackexchange.com/questions/229620/how-to-get-around-the-circular-reference-issue-with-json-andritity
[6] https://stackoverflow.com/questions/10191671/jackson-json-serialization-recursion-avoidance-by-gevel--apibendrinimas
[7] https://learn.microsoft.com/en-us/dotnet/standard/serialization/System-Text-json/preserve-references
[8] https://stackoverflow.com/questions/12584986/how-to-fix-circular-reference-error-when-dealing-with-json
[9] https://forums.servicestack.net/t/circular-references-in-jsonserializer-and-stackoverflow-exceptions/5725