#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 классе, затем все сработало!