Member 12061698 Ответов: 1

Когда 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);

Я до сих пор не понимаю, что именно было не так.

1 Ответов

Рейтинг:
2

Gerry Schmitz

Обратите внимание на использование "обработчиков ошибок (событий)".

Примеры сериализации XML | Microsoft Docs[^]