Он - среди других применений - ярлык для инициализации коллекций. Подробнее ...
Ваша проблема в том, что при десериализации коллекции, которая не доступна только для чтения, Json.NET проверяет, была ли коллекция уже выделена, например, в конструкторе содержащего типа. Если это так, он заполняет уже существующую коллекцию для десериализованного содержимого JSON и никогда не устанавливает коллекцию обратно. К сожалению, ваше свойство возвращает временную коллекцию прокси, поэтому ваш контейнерный класс SpecialObject
никогда не получает десериализованные результаты.
Самый простой способ предотвратить это - указать, что Json.NET должен всегда выделять новую коллекцию и установите его обратно, а не повторно используйте ранее существовавшую коллекцию, используя настройку JsonPropertyAttribute
ObjectCreationHandling = ObjectCreationHandling.Replace
[JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)]
public List<string> SpecialObjectIDs { get { return SpecialObjectCollection.Select(x => x.ID).ToList(); } set { tempObjectIDs = value; } }
Альтернативно вы можете использовать string []
, а не List<string>
для вашего свойства для сбора прокси:
public string [] SpecialObjectIDs { get { return SpecialObjectCollection.Select(x => x.ID).ToArray(); } set { tempObjectIDs = value == null ? null : value.ToList(); } }
Поскольку массивы не могут быть изменены, Json.NET всегда будет выделять новый массив при десериализации и установить его после завершения.