JSON 직렬화에서 재귀 참조 또는 원형 참조를 처리하려면 스택 오버플로 예외 또는 데이터 불일치와 같은 문제를 피하기 위해 신중한 고려가 필요합니다. 다음은 이러한 참조를 관리하기위한 몇 가지 모범 사례입니다.
원형 참조 이해
원형 참조는 객체가 첫 번째 객체를 참조하여 루프를 만드는 다른 객체를 참조 할 때 발생합니다. 이로 인해 JSON 직렬화 중에 문제가 발생하면 무한 재귀가 발생할 수 있습니다.
원형 참조를 처리하기위한기술
1. 원형 참조 피 **
모범 사례는 데이터 모델을 재구성하여 순환 참조를 모두 피하는 것입니다. 그러나 이것은 특히 객체 간의 복잡한 관계를 다룰 때 항상 가능하지는 않습니다.
2. 고유 식별자 사용 **
효과적인 전략 중 하나는 원형 참조를 고유 식별자 또는 대리 키로 바꾸어 원형 참조를 중단하는 것입니다. 여기에는 각 객체를 한 번 연속화하고 후속 발생을 위해 참조 (예 : ID)를 사용하는 것이 포함됩니다. 이 접근법은 각 객체가 한 번만 직렬화되어 데이터 복제를 줄이고 효율성을 향상시킵니다.
3.
JSON.NET은`serialize 또는`gulore`로 설정할 수있는`referenceloophandling` 옵션을 제공합니다. 'Serialize'옵션은 후속 발생에 대한 참조를 사용하여 완전한 객체 그래프를 직렬화하며, 이는 복제없이 원형 참조를 정확하게 보존합니다. '무시'옵션은 순환 참조를 제외하여 직렬화를 단순화하지만 데이터 불일치와 복제를 초래할 수 있습니다.
4.
JSON.NET은 또한 'PreserVereferenceshandling'을 지원하며 각 직렬화 된 개체에`$ id` 속성을 추가합니다. 동일한 객체에 대한 후속 참조는 원래`$ id`를 가리키는`$ ref '속성으로 표시됩니다. 이 방법은 동일한 객체의 중복 직렬화를 피함으로써 순환 참조를 효율적으로 처리합니다.
5. System.text.json ReferenceHandler **
.NET의`system.text.json`에서`referenceHandler '속성을 사용하여 객체 참조를 보존 할 수 있습니다. `referenceHandler.preserve '로 설정하면 JSON.NET의 접근 방식과 유사한 메타 데이터를 추가하여 메타 데이터를 추가하여 원형 참조를 처리 할 수 있습니다.
6. 사용자 정의 직렬화 **
내장 설정에서 다루지 않는 시나리오의 경우 사용자 정의 변환기 또는 핸들러를 만들 수 있습니다. 여기에는 참조를 수동으로 추적하고 해결하기위한 논리를 구현하여 복잡하거나 특정 사용 사례에 대한 유연성을 제공합니다.
7. 원형 참조 무시 **
원형 참조를 보존 할 필요가 없다면 Jackson에서`@jsonignore`와 같은 주석을 사용하여 다른 라이브러리의 유사한 메커니즘을 사용하여 무시할 수 있습니다. 이 접근법은 직렬화를 단순화하지만 불완전한 데이터 표현으로 이어질 수 있습니다.
올바른 접근법 선택
방법 선택은 특정 요구 사항 및 성능 고려 사항에 따라 다릅니다.
- 데이터 무결성 : 완전한 객체 그래프를 보존하는 것이 중요하다면`referenceloophandling.serialize` 또는`referenceHandler.preserve '와 같은 기술을 사용하십시오.
- 효율성 : 데이터 크기를 최소화하고 복제를 피하는 것이 우선 순위 인 경우 고유 식별자 또는 참조를 사용하십시오.
- 단순성 : 원형 참조가 중요하지 않은 경우이를 무시하는 것이 가장 간단한 솔루션 일 수 있습니다.
궁극적으로 원형 참조를 처리하려면 데이터 무결성, 효율성 및 단순성 사이의 상충 관계를 효과적으로 이해해야합니다.
인용 :[1] https://github.com/dotnet/corefx/issues/40045
[2] https://www.linkedin.com/pulse/effice handling-circular-references-json-breaking-power-pawar
[3] https://www.reddit.com/r/unity3d/comments/gjvv2n/json_serializing_of_recursive_class/
[4] https://infinum.com/handbook/dotnet/best-practices/json-serialization-and-deserialization
[5] https://softwareengineering.stackexchange.com/questions/229620/how-to-get-around-the-circular-reference-scue-with-json-and-entity
[6] https://stackoverflow.com/questions/10191671/jackson-json-serialization-vyoidance-by-level-defining
[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 with-json
[9] https://forums.servicestack.net/t/circular-references-nsonserializer-and-stackoverflow-exceptions/5725