Десериализация 2,6 тыс. строк XML в Dotnet 5

#c# #.net-core #.net-5

Вопрос:

Существует ли ограничение на то, насколько большими могут быть строки xml для десериализации в ядре dotnet (.net 5)?

Все шло нормально. но когда я начал получать более 2500 строк xml-строки, я получил «значение было либо слишком большим, либо слишком маленьким для байта без знака».

Диагностика:

  • протестировал более старые версии тех же xml-данных (было более 2000 строк, но меньше, чем в новой). так что это связано с данными.
  • протестировано с помощью Visual Studio Paste as XML для создания классов из xml. Новые и Старые классы совершенно одинаковы. Таким образом, структура/схема остается неизменной.
  • протестировал новый xml в нескольких инструментах проверки xml, все они сообщают, что в нем нет ошибок. так что это не ошибка в данных.

из вышесказанного кажется, что я достиг некоторого предела.

Вещи, которые я пробовал:

 using System.Xml.Serialization;
using System.Text;

var stringReader = new StringReader(xmlStr);
var serializer = new XmlSerializer(typeof(MyClass));
var obj1 = serializer.Deserialize(stringReader) as MyClass;



var bytes = Encoding.UTF8.GetBytes(xmlStr);
MemoryStream memStream = new(bytes);
var obj2 = serializers.Deserialize(memStream) as MyClass;
 

Я пробовал целиться по-другому net5.0-windows7.0 , net5.0-windows10.0.20348.0 , net5.0-10.0.19041.0

Есть какие-нибудь идеи о том, что это может быть? (извините, если мой вопрос примитивен, я учусь).

Комментарии:

1. значение было либо слишком большим, либо слишком маленьким для байта без знака — это проблема с данными , где-то у вас есть значение меньше 0 или больше 255, которое вы пытаетесь присвоить byte

2. @stuartd, у меня есть такие атрибуты, как»<идентификатор пользователя=» 867 «/> » это то, о чем вы говорите?

3. Вы пытаетесь сохранить это значение как a byte ?

4. хмм. Я просто посмотрел, что вставила visual studio.. некоторые поля имеют значение ushort, другие-байт.. / / / <примечания /> [XmlAttribute] открытый идентификатор ushort { get =<примечания />> Поле идентификатора; set =<примечания />>> Поле идентификатора = значение; } ` / / / <примечания />><примечания /> [XmlAttribute] открытый идентификатор байта { get =<примечания />> Поле идентификатора; set =<примечания />>> Поле идентификатора = значение; }`

5. Хорошо, я понял. если бы я изменил все байты на ushort, все работало бы. Спасибо за подсказку !stuartd!

Ответ №1:

Проблема заключалась в том, что я использовал Past XML as Class команду буфера обмена в Visual studio. Похоже , что он присвоил byte некоторым целочисленным значениям, поступающим из xml string , и некоторым присвоенным ushort . Я заменил все byte на ushort в сгенерированном Visual Studio классе, затем все сработало!