Когда xmlserializer.deserialize встречает узел/тег, который не сопоставляется с объектом?
Я пытаюсь десериализовать XML из TextReader и получаю эту ошибку:
exception of type 'System.InvalidOperationException' occurred in Microsoft.GeneratedCode and wasn't handled before a managed/native boundary Additional information: <Incident xmlns=''> was not expected.
Ошибка возникает в последней строке:
string dataXml = (string)dbDataReader["DataXML"]; XmlSerializer xmlSerializer = new XmlSerializer(typeof(Incident), new XmlRootAttribute { ElementName = "IncidentGet" }); System.IO.TextReader textReader = new System.IO.StringReader(dataXml); incident = (Incident)xmlSerializer.Deserialize(textReader);
В dataXML есть несколько тегов, которые вообще не сопоставляются ни с одним объектом. Десериализатор просто игнорирует их или они вызывают ошибку? Или ошибка исходит из какого-то другого источника?
<incident> <incidentnum>20180323905 <OccurredOn /> <reportedon>2019-02-01 <reportingofficer>TEST,TEST <location> <recnum>102953131 <house>4471 <street>TESTSTREETNAME2 PK <CrossStreet /> <streetaddr>4471 TESTSTREETNAME2 PK <city>TESTCITY <state>TN <zip>37013 <X /> <Y /> <Latitude /> <Longitude /> <county>019 <Validated /> <precinct>SOUTH <RPA /> <Zone /> <countrycode>USA <offenses> <offense> <code>120</code> <description>ROBBERY - STREET-WEAPON <offense> <code> <description>MATTEROFRECORD </code><code> </code><code> <victims> <victim> <involvementnum>1 <race>B <sex>F <dob>1988-07-13 <name>TESTNAME2,TESTNAME3 <masterrecnum>71931912 <victimoffenses> <victimoffense> <offensecode>0003 <NibCode /> <offensename>MATTER OF RECORD <victimnum>1 <linkofflrecnum>60036199 <linkoffloffenserec>13808415 <linkofflrecnum>6296009 <linkvictimrecnum>71931912 <relationships> <relationship> <victimnumber>1 <suspectnumber>1 <relation>17 <victimname>TESTNAME3 TESTNAME2 <suspectname>TESTNAME4 TESTNAME5 <linkincsusrecnum>6356248 <suspects> <suspect> <suspecttype>KNOWN <involvementnum>1 <race>B <sex>M <dob>07/16/1987 <Age /> <name>TESTNAME5, TESTNAME4 <linkincsusrecnum>6356248 <source_rec>60036198 <callsforservice> <callforservice> <location> <recnum>102524782 <House /> <Street /> <crossstreet>17TH AV N <streetaddr>1600 TESTSTREETNAME ST <city>NORTH <State /> <Zip /> <X /> <Y /> <Latitude /> <Longitude /> <County /> <Validated /> <precinct>NORTH <rpa>4475 <zone>613N <CountryCode /> <callreceived>20180411 05:07 <tencode>41P"
Что я уже пробовал:
Я не очень старался. Я работаю в рамках командной структуры и не могу изменить код, не затрагивая всю команду. Я просто пытаюсь выяснить точный источник и природу ошибки.
Maciej Los
Можете ли вы поделиться xml-данными и определением класса?
Мы не можем помочь вам, не зная подробностей.
Maciej Los
Воспользуйся Улучшить вопрос виджет! Не оставляйте код в комментарии! Я удалю ваши комментарии.
Maciej Los
Похоже, ваш xml-файл недействителен! Несколько отсутствующих закрывающих меток.
Member 12061698
Сайт не позволил мне вставить весь XML-файл целиком. Я просто пытаюсь понять что именно
"Дополнительная информация: <инцидент xmlns="> не ожидался." означает. С таким несговорчивым веб-сайтом неудивительно, что мне трудно найти ответ.
Maciej Los
Я говорю об этом, например:
<incidentnum>20180323905
так и должно быть:
<incidentnum>20180323905</incidentnum>
Member 12061698
Это ошибка вырезания и вставки с моей стороны. Просто предположим, что он там. Я пытался дать сокращенную версию, которая поместилась бы в разрешенном пространстве. XML-код в программе верен.
Maciej Los
ОК. Каково ваше определение класса?
Member 12061698
Это начало урока. Веб - страница не позволяет мне опубликовать полную версию. Мне интересно, нужно ли мне добавить прикрепленное свойство, например
[Сериализуемый, XmlRoot("инцидент")] к классу. ( Я попробовал, и это не сработало).
инцидент с публичным классом : DomainObject
{
#количество происшествий области
частная строка incidentNumber;
[XmlElement(ElementName = "IncidentNum")]
.
.
.
объекты и методы
.
.
.
}
Member 12061698
Возможно, я наткнулся на способ обойти проблему. Вот сериализация/десериализация:
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Incident), new XmlRootAttribute { ElementName = "IncidentGet" });
System.IO.TextReader textReader = новый System.IO.StringReader(dataXml);
инцидент = (инцидент)xmlSerializer.Десериализация(textReader);
Когда я достал параметр XmlRootAttribute для сериализатора, процесс сработал.
XmlSerializer xmlSerializer = новый XmlSerializer(typeof(инцидент));
System.IO.TextReader textReader = новый System.IO.StringReader(dataXml);
инцидент = (инцидент)xmlSerializer.Десериализация(textReader);
Я до сих пор не понимаю, что именно было не так.