json.net benutzerdefinierte Multi -State -Objekte serialisieren, kein zusätzliches Typenfeld
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
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>
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
<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>
GetTypeFromSubType
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.$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!