2013-12-02 1 views
6

Я создал простой класс с одним полем. class Test{int value;}JSON.NET не может обрабатывать десериализацию простого массива?

Если я использую функцию сохранения ссылок и устанавливаю ее как «все» (т.е. как объекты, так и массивы), то, когда я просто сериализую массив объектов Test, он становится сериализованным как объект JSON со специальным член «$ values» со значениями массива вместе с ожидаемым свойством «id id» для сохранения ссылки на массив. Это очень хорошо, но снова все это ломается от десериализации.

Пройдя через исходный код, я обнаружил, что просто потому, что тест для «IsReadOnlyOrFixedSize» является истинным, он устанавливает флаг «createdFromNonDefaultConstructor» в true, что даже не имеет никакого смысла, поскольку, хотя это фиксированный размер array, он создается из конструктора по умолчанию, если только он не рассматривает конструктор массива с фиксированным размером нестандартный конструктор. Суть в том, что он должен иметь возможность обрабатывать что-то настолько базовое, и все же он выдает эту ошибку: «Cannot preserve reference to array or readonly list, or list created from a non-default constructor».

Как можно десериализовать базовый массив, сохраняя все ссылки в JSON.NET без получения ошибки?

+1

Вам удалось решить вашу проблему? –

+0

Для решения более общей версии этой проблемы, где массив может включать рекурсивную саморегуляцию, см. [Не удается сохранить ссылку на массив или список только для чтения или список, созданный из конструктора, отличного от стандартного] (http: // stackoverflow .com/д/41293407/3744182). – dbc

ответ

1

Возможно, вам будет всего лишь позвонить по телефону ToObject(...) и введите тип. Это должно работать:

class Test { public int Value; } 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var array = new Test[2]; 
     var instance = new Test {Value = 123}; 

     array[0] = instance; 
     array[1] = instance; 

     var settings = new JsonSerializerSettings 
     { 
      PreserveReferencesHandling = PreserveReferencesHandling.All 
     }; 

     string serialized = JsonConvert.SerializeObject(array, settings); 

     // Explicitly call ToObject() and cast to the target type 
     var deserialized = (Test[]) ((JArray)JsonConvert.DeserializeObject(serialized, settings)).ToObject(typeof(Test[])); 

     Debug.Assert(deserialized[0].Value == 123); 
    } 
} 
2

Получил тот же вопрос, я использовал List<T> вместо T[], чтобы исправить это.

 Смежные вопросы

  • Нет связанных вопросов^_^