Десериализация JSON.NET "зависает" (моно) - PullRequest
1 голос
/ 04 декабря 2010

mono-core-2.6.4-2.13.x86_64 Json.NET 3.5 Release 8

Я вызываю десериализатор, и он работает - я вижу объекты, созданные (десериализованные), но затем десериализатор никогда не завершается /возвращает.

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

Объекты ListEntry создаются, затем программа «зависает».«Десериализация завершена» никогда не появляется.

Полезная нагрузка JSON составляет 1938 КБ:

[{"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},
... ]

без завершающего перевода строки.Не сложный;он декодирует в объект:

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; }      
}

Ответы [ 2 ]

2 голосов
/ 04 декабря 2010

Я нашел проблему;в одном из элементов JSON был атрибут «версия» «ноль».Это, конечно, не может десериализовать в .NET "int".Кажется, что исключение в потоке десериализации не распространяется в основной поток.В любом случае, изменение объекта сериализации решило проблему:

[JsonPropertyAttribute("version")]
public int? Version 
{  
  set 
  {
    if (value == null)
      this.version = 0;
    else
      this.version = (int)value;       
  }
  get { return this.version; }
}
0 голосов
/ 05 декабря 2010

Правильный способ работы с обнуляемыми типами:

[JsonPropertyAttribute("version")]
public int? Version 
{  
    set 
    {
        this.version = value ?? default(int);
    }
    get
    {
      return this.version;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...