json.net Les objets multi-états personnalisés sérialisent, aucun champ de type supplémentaire
Le paramètre
/ inverse-séquentilation du réglage / dérivé / dérivé du JSON.net est très pratique. Cependant, cette méthode introduira des champs supplémentaires dans le JSON sérialisé, augmentant les frais généraux. TypeNameHandling.Auto
$type
Solution:
Classe de base personnalisée avec des attributs de type de codage:
Au lieu des informations sous-type stockées dans la classe des conteneurs, il est préférable de l'ajouter en tant qu'attribut à la classe de base:
Cet attribut reflète le type de l'objet de l'objet et le code en valeur d'énumération.Le dictionnaire doit être implémenté par lui-même pour cartographier le type de valeur énumérée.
<code class="language-csharp">[JsonConverter(typeof(SubTypeClassConverter))] public class SubTypeClassBase { [JsonConverter(typeof(StringEnumConverter))] public SubType Type { get { return typeToSubType[GetType()]; } } }</code>
typeToSubType
:
La méthode doit être implémentée par elle-même et renvoie le type correspondant en fonction de la valeur d'énumération.
JsonConverter
Avantages:
<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
Encodage d'informations sous-type dans les attributs de la classe, indépendamment du conteneur.
La circularisation est traitée dynamiquement, permettant à la structure de la classe de modifier la structure de la classe à l'avenir sans endommager la sérialisation. Il élimine le champ
redondant dans la sortie JSON et réduit sa taille.$type
. L'énumération correspondante. Les méthodes doivent effectuer un mappage inverse.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!