2010-12-04 4 views
1

mono-core-2.6.4-2.13.x86_64 Json.NET version 3.5 8JSON.NET Désérialisation "gèlera" (Mono)

j'appelle désérialiseur et cela fonctionne - je peux voir les objets créés (désérialisé) mais le désérialiseur ne sort jamais/retourne.

List<ListEntry> listed_entries = JsonConvert.DeserializeObject<List<ListEntry>>(payload); 
Console.WriteLine("Deserialization complete"); 

Les objets ListEntry sont créés, puis le programme se bloque. "Désérialisation terminée" n'apparaît jamais.

La charge utile JSON est 1,938K de:

[{"entityName": "Contact", "version": 27, "displayName": "", "objectId": 11446184}, {"entityName": "Contact", "version": 33, "displayName": "", "objectId": 10148760}, {"entityName": "Contact", "version": 35, "displayName": "", "objectId": 12695703}, {"entityName": "Contact", "version": 33, "displayName": "", "objectId": 7575210}, 
... ] 

sans retour à la ligne de fuite. Aucun complexe il décode à un objet de:

public class ListEntry 
{ 
    public ListEntry() 
    { 
    Console.WriteLine("Created ListEntry"); 
    } 

    [JsonPropertyAttribute("entityName")] 
    public string EntityName { get; set; } 

    [JsonPropertyAttribute("objectId")] 
    public int Objectid { get; set; } 

    [JsonPropertyAttribute("version")] 
    public int Version { set; get; }  

    [JsonPropertyAttribute("displayname")] 
    public string DisplayName { set; get; }  
} 
+0

Pouvez-vous poster votre JSON? – Oded

Répondre

2

J'ai trouvé le problème; dans l'un des éléments JSON, il y avait un attribut "version" de "null". Ceci, bien sûr, ne peut pas désérialiser en .NET "int". L'exception dans le thread de désérialisation ne semble pas se propager au thread principal. Quoi qu'il en soit, de modifier l'objet de sérialisation a résolu le problème:

[JsonPropertyAttribute("version")] 
public int? Version 
{ 
    set 
    { 
    if (value == null) 
     this.version = 0; 
    else 
     this.version = (int)value;  
    } 
    get { return this.version; } 
} 
+0

Je viens de rencontrer la même chose. J'ai transmis l'info avec un test aux gardiens de la sérialisation Xml. – Gonzalo

0

La bonne façon de travailler avec les types nullable:

[JsonPropertyAttribute("version")] 
public int? Version 
{ 
    set 
    { 
     this.version = value ?? default(int); 
    } 
    get 
    { 
     return this.version; 
    } 
} 
+0

Je ne dirais pas que c'est la bonne façon. Si une propriété est nullable, il devrait être possible de définir sa valeur à null. Sinon, la propriété ne devrait pas être nulle ". – erikkallen

+0

@erikkallen: Accepte si la propriété de l'objet est nullable par conception. Mais si c'est juste int mais rempli à partir du web, c'est pourquoi le type entrant est nullable et utilisé comme je l'ai écrit. – abatishchev

+0

Si c'est juste un patch après la désérialisation, je le ferais avec un callback OnDeserialized au lieu de faire de la propriété quelque chose que ce n'est pas. – erikkallen