2017-02-01 1 views
2

Ich verwende die Net20-Bibliothek von Json.NET (v90r1) in Unity3D und ich versuche, Json.NET zu verwenden, um ein Feld vom Typ Typ zu serialisieren.Serialize-Feld vom Typ Typ mit FormatterAssemblyStyle.Simple in Json.NET

Ich habe festgestellt, dass FormatterAssemblyStyle kann die automatisch generierten Typ Informationen auswirken, aber es scheint nicht Auswirkungen auf Felder, die vom Typ Typ sind. Zum Beispiel:

using Newtonsoft.Json; 
using System.Runtime.Serialization.Formatters; 
using UnityEngine; 

public class Example : MonoBehaviour 
{ 
    void Start() 
    { 
     var settings = new JsonSerializerSettings() { 
      Formatting = Formatting.Indented, 
      TypeNameHandling = TypeNameHandling.All, 
      TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple, 
     }; 

     Debug.Log(JsonConvert.SerializeObject(new Foo(), settings)); 
    } 
} 

public class Foo 
{ 
    public System.Type type = typeof(void); 
} 

Diese im folgenden JSON-String führen wird:

{ 
    "$type": "Foo, Assembly-CSharp", 
    "type": "System.Void, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
} 

Wie Sie sehen können, hat FormatterAssemblyStyle.Simple für $type verwendet worden, aber FormatterAssemblyStyle.Full wurde für type verwendet.

Dies ist meine gewünschte Ausgabe:

{ 
    "$type": "Foo, Assembly-CSharp", 
    "type": "System.Void, mscorlib" 
} 

Wie kann ich beide Arten die gleiche Art und Weise drucken? Ich konnte keine Antwort finden, da sich die meisten Suchergebnisse auf das Serialisieren von privaten Mitgliedern oder das Serialisieren von Klassen mit Typinformationen beziehen, anstatt Klassen zu serialisieren, die Typen enthalten.

Antwort

2

Nach sources:

internal static bool TryConvertToString(object value, Type type, out string s) 
{ 
    //... 
    type = value as Type; 
    if (type != null) 
    { 
     s = type.AssemblyQualifiedName; 
     return true; 
    } 
    //... 
} 

Wenn Objekttyp von Type Typ ist, es als Type.AssemblyQualifiedName

formatiert ist auch immer Sie CustomJsonConverter Beispiel folgen kann benutzerdefinierten Konverter für Type zu erstellen:

public class TypeConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     if (typeof(System.Type).IsAssignableFrom(value.GetType())) 
     { 
      // here you decide how much information you really want to dump 
      Type type = (Type)value; 
      writer.WriteValue(type.FullName + ", " + type.Assembly.GetName().Name); 
     } 
     else 
     { 
      JToken t = JToken.FromObject(value); 
      t.WriteTo(writer); 
     } 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter."); 
    } 

    public override bool CanRead 
    { 
     get { return false; } 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return typeof(System.Type).IsAssignableFrom(objectType); 
    } 
} 

und verwenden Sie wie:

var settings = new JsonSerializerSettings() 
    { 
     Formatting = Formatting.Indented, 
     TypeNameHandling = TypeNameHandling.All, 
     TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple, 
     Converters = { new TypeConverter() } 
    }; 

    Console.WriteLine(JsonConvert.SerializeObject(new Foo(), settings)); 
Verwandte Themen