Класс десериализации System.Text.Json, реализующий IReadOnlyCollectionC#

Место общения программистов C#
Ответить
Anonymous
 Класс десериализации System.Text.Json, реализующий IReadOnlyCollection

Сообщение Anonymous »

У меня есть класс, реализующий IReadOnlyCollection, и я не могу десериализовать строку json, созданную во время сериализации:

Код: Выделить всё

public class MyItems : IReadOnlyCollection
{
private readonly List _items;

[JsonConstructor]
public MyItems(IReadOnlyCollection items)
{
_items = items != null ? new List(items) : new List();
}

[JsonIgnore]
public int Count => _items.Count;

public IEnumerator GetEnumerator()
{
return _items.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
и исполняющий код:

Код: Выделить всё

MyItems myItems1 = new MyItems([1, 2, 3]);
string jsonStr = System.Text.Json.JsonSerializer.Serialize(myItems1); // produces string '[1,2,3]'
MyItems? myItems2 = System.Text.Json.JsonSerializer.Deserialize(jsonStr); // throws
выдается исключение:

System.NotSupportedException: 'Тип коллекции «MyItems» является абстрактным, это интерфейс , или доступен только для чтения и не может быть создан и заполнен. Путь: $ | НомерЛинии: 0 | BytePositionInLine: 1.'

Я ожидаю, что будет использоваться ctor, отмеченный [JsonConstructor], но, возможно, проблема заключается в имени аргумент..?
Использование специального JsonConverter — единственный выход?
Ой… чуть не забыл — использование net9
Спасибо. заранее

Подробнее здесь: https://stackoverflow.com/questions/793 ... collection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»