Heim > Backend-Entwicklung > C++ > Wie kann ich eine benutzerdefinierte Serialisierung polymorpher untergeordneter Objekte in Json.Net ohne das Feld „$type' erreichen?

Wie kann ich eine benutzerdefinierte Serialisierung polymorpher untergeordneter Objekte in Json.Net ohne das Feld „$type' erreichen?

Linda Hamilton
Freigeben: 2025-01-24 13:12:10
Original
206 Leute haben es durchsucht

How Can I Achieve Custom Serialization of Polymorphic Child Objects in Json.Net Without the

json.net benutzerdefinierte Multi -State -Objekte serialisieren, kein zusätzliches Typenfeld

<:> Frage:

Die

Einstellung/Inverse -Sequentialisierung der

Einstellung/Derivat des json.net ist sehr bequem. Diese Methode führt jedoch zusätzliche TypeNameHandling.Auto Felder im serialisierten JSON ein und erhöht den Overhead. $type

Lösung:

Benutzerdefinierte Basisklasse mit Codierungstypattributen:

Anstelle von Informationen zum Sub -Typ in der Containerklasse ist es besser, sie als Attribut zur Basisklasse hinzuzufügen:

Dieses Attribut spiegelt den Typ des Objekts des Objekts wider und codiert es in einen Aufzählungswert.

Wörterbuch muss von selbst implementiert werden, um den Typ dem aufzähligen Wert zuzuordnen.
<code class="language-csharp">[JsonConverter(typeof(SubTypeClassConverter))]
public class SubTypeClassBase
{
    [JsonConverter(typeof(StringEnumConverter))]
    public SubType Type { get { return typeToSubType[GetType()]; } }
}</code>
Nach dem Login kopieren

JsonConverter wird für Deepse verwendet: typeToSubType

Erstellen Sie ein benutzerdefiniertes :

Die Methode muss von selbst implementiert werden und gibt den entsprechenden Typ gemäß dem Aufzählungswert zurück. JsonConverter

Vorteile:
<code class="language-csharp">public class SubTypeClassConverter : JsonConverter
{
    // 读取 JSON 并确定实际类型
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var token = JToken.Load(reader);
        var typeToken = token["Type"];
        var actualType = SubTypeClassBase.GetTypeFromSubType(typeToken.ToObject<SubType>(serializer)); // 使用 GetTypeFromSubType 方法
        if (existingValue == null || existingValue.GetType() != actualType)
        {
            // 创建实际的对象实例
            var contract = serializer.ContractResolver.ResolveContract(actualType);
            existingValue = contract.DefaultCreator();
        }
        // 使用 "Populate" 方法避免无限递归
        using (var subReader = token.CreateReader())
        {
            serializer.Populate(subReader, existingValue);
        }
        return existingValue;
    }

    // ...其他方法 (WriteJson 等) ...
}</code>
Nach dem Login kopieren

GetTypeFromSubType

sub -type Informationscodierung in den Attributen in der Klasse, unabhängig vom Container.

Kreisformisation wird dynamisch behandelt, sodass die Klassenstruktur die Klassenstruktur in Zukunft ohne Beschädigung der Serialisierung ändern kann.

es eliminiert das redundante Feld in der JSON -Ausgabe und reduziert seine Größe.
  • <:> Aufzählung sollte alle möglichen Sub -Typen enthalten. Das Wörterbuch sollte den Typ jeder Unterklasse dem entsprechenden
  • Aufzählungswert abbilden. $type Methoden sollten Reverse Mapping durchführen.

Das obige ist der detaillierte Inhalt vonWie kann ich eine benutzerdefinierte Serialisierung polymorpher untergeordneter Objekte in Json.Net ohne das Feld „$type' erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage