Десериализовать список XML в замороженный наборC#

Место общения программистов C#
Ответить
Anonymous
 Десериализовать список XML в замороженный набор

Сообщение Anonymous »

Для такого класса:
public class A {
public FrozenSet Foo {get; set;}
}

с XML:


1
2
3



Попытка десериализации этого как есть вызывает исключение System.InvalidOperationException с сообщением «Вы должны реализовать метод доступа по умолчанию для System.Collections.Frozen.FrozenSet`1 [...], поскольку он наследуется от ICollection».
Изменение A.Foo на HashSet позволяет мне прекрасно десериализовать, как ожидаемо. Я попытался использовать HashSet в качестве прокси для замороженного члена набора:
[XmlElement(ElementName = nameof(Foo))]
public HashSet FooProxy
{
get => Foo?.ToHashSet() ?? [];
set => Foo = value.ToFrozenSet();
}

но это приводит к еще одному исключению InvalidOperationException с сообщением «В XML-документе (3, 8) есть ошибка [...] методы ReadElementContentAs() не могут быть вызваны для элемента, у которого есть дочерние элементы. Строка 3, позиция 8».
Я не хочу использовать обычный хэш-набор, потому что этот код используется для объекта настроек программы. Эти настройки будут считываться в нескольких потоках и много раз (не менее 100 000 проверок), поэтому мы ценим дополнительную скорость, которую FrozenSet предлагает по сравнению с HashSet.
Использование этого предложения (обертывание HashSet в другой класс и использование его в качестве типа прокси для целевого замороженного набора) позволило мне заставить что-то работать, но это делает XML и код немного более неуклюжим, чем я например.
Другие вопросы касаются незамороженных коллекций, которые не решают проблемы, которые кажутся уникальными для замороженных коллекций.
Полный, самый простой и работоспособный пример кода:
using System.Collections.Frozen;
using System.Xml.Serialization;

var xml = """


1
2
3


""";

var xmlSeriailizer = new XmlSerializer(typeof(A));
StringReader reader = new StringReader(xml);
A a = (A)xmlSeriailizer.Deserialize(reader)!;

foreach (int i in a.Foo)
Console.WriteLine(i);

public class A
{
public FrozenSet Foo { get; set; }
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... frozen-set
Ответить

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

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

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

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

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