2016-09-12 1 views
2

Ich habe die Probleme mit der Serialisierung Int32 und bekommen Int64 beim Deserialisieren. Mein Problem ist allgemeiner, ich habe ein Array von object s, die Int32 neben Int64 halten kann.Wie können beliebige Daten de-/serialisiert werden, während die Typen beibehalten werden?

So kann ich nicht benutzerdefinierte Konverter auf Deserialisierung schreiben und blind davon ausgehen, dass alles Int32/Int64 ist.

Wie Serialisierung/Deserialisierung in diesem Fall umgehen?

+0

Sind diese Vorkommen von Int32 vorhersagbar? –

+0

Sieht ähnlich aus [JSON.net (de) serialisiert nicht typisierte Eigenschaft] (https://stackoverflow.com/questions/38777588/json-net-deserialize-unyped-property). – dbc

+0

@DominiqueLorre, nein, überhaupt nicht. – astrowalker

Antwort

0

können Sie verwenden die UntypedToTypedValueConverter von JSON.net (de)serialize untyped property, mit einem Unterschied - Sie können es auf die Array-Elemente anstatt das Array anwenden müssen sich [JsonProperty(ItemConverterType = typeof(UntypedToTypedValueConverter))], zB:

public class RootObject 
{ 
    [JsonProperty(ItemConverterType = typeof(UntypedToTypedValueConverter))] 
    public object [] Items { get; set; } 
} 

Dieser den Konverter auf die Einträge gilt das Array und nicht das Array selbst. Dann serialisiert und deserialisiert mit JsonSerializerSettings.TypeNameHandling = TypeNameHandling.Auto, z.B .:

var root = new RootObject { Items = new object[] { 1, 1L, int.MaxValue, long.MaxValue } }; 
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }; 
var json = JsonConvert.SerializeObject(root, settings); 
var root2 = JsonConvert.DeserializeObject<RootObject>(json, settings); 

Probe fiddle.

+0

Vielen Dank, das ist peinlich, denn selbst im einfachsten Fall (wie oben), bekomme ich alle Werte zurück. Momentan kann ich nicht sagen warum, aber 'WriteJson' wird wie erwartet aufgerufen, aber' ReadJson' wird komplett ignoriert. Ich schaue und schaue und sehe nicht, warum es ignoriert wird. – astrowalker

+0

@astrowalker - Ich habe ein Beispiel [Geige] (https://dotnetfiddle.net/FPdg5B) hinzugefügt. – dbc

+0

Danke, endlich gefunden! Wenn Sie einen expliziten Konstruktor für 'RootObject' hinzufügen, ein Array von Objekten nehmen und' Items' setzen, wird die Methode 'ReadJson' nicht ** aufgerufen. Noch ein Mal vielen Dank! (Ich lege Kommentare hoch, aber sie sind nicht sichtbar). – astrowalker

Verwandte Themen