Может ли System.Text. Json .JsonSerializer сериализовать коллекции для свойства, доступного только для чтения? - PullRequest
2 голосов
/ 15 января 2020

У меня проблемы с получением новой System.Text.Json для десериализации коллекций, хранящихся в свойствах только для чтения.

Рассмотрим следующие классы:

public class SomeItem {
    public string Label { get; set; }
}

public class SomeObjectWithItems {

    public string Label { get; set; }

    // Note this property is read-only but the collection it points to is read/write
    public ObservableCollection<SomeItem> Items { get; }
        = new ObservableCollection<SomeItem>();
}

Вот JSON:

{
  "Label": "First Set",
  "Items": [
    {
      "Label": "Item 1"
    },
    {
      "Label": "Item 2"
    },
    {
      "Label": "Item 3"
    },
    {
      "Label": "Item 4"
    }
  ]
}

Вот код, который я запускаю ...

var json = ...;
var obj = JsonSerializer.deserialize<SomeObjectWithItems>(json);
Debug.WriteLine($"Item Count for '{obj.label}': {obj.Items.Count}");  

Выше приведено следующее:

Item Count for 'First Set': 0

Если я изменю Items на чтение / запись, тогда это работает, но многие из наших моделей имеют свойства только для чтения, которые содержат изменяемые коллекции, поэтому мне интересно, сможем ли мы вообще использовать это.

Примечание: Json. NET обрабатывает это правильно, внутренне вызывая метод «Добавить» в существующей коллекции, а не создавая новую, но я не знаю, как этого добиться вне письменности пользовательские конвертеры для всех классов, которые мы определили.

1 Ответ

2 голосов
/ 15 января 2020

Это сделано специально для коллекций, в которых нет сеттера. Чтобы избежать проблем с добавлением в предварительно заполненные коллекции (которые не создает экземпляр сериализатора), десериализатор использует семантику «замена», которая требует, чтобы коллекция имела установщик.

Источник: https://github.com/dotnet/corefx/issues/41433

В настоящее время существует открытый выпуск для Support adding to collections if no setter

https://github.com/dotnet/corefx/issues/39477

Моя рекомендация по-прежнему использовать Json.NET в этом случае, если вы не хотите писать конвертер клиента.

...