Сериализация XML: System.InvalidOperationException: <tagname>не ожидалось - PullRequest
3 голосов
/ 15 июня 2009

Я пытаюсь десериализовать XML-документ, и когда десериализатор встречает определенный тег на полпути вниз по документу, он выдает ошибку:

System.InvalidOperationException <mytagname> was not expected.

Прямо перед ним в классе есть тег [System.Xml.Serialization.XmlArrayItemAttribute("MyTagName", typeof(MediaFile))], и ошибка возникает только в этом конкретном теге / классе, но я не могу найти в этом ничего другого, что могло бы вызвать это. Кто-нибудь когда-либо видел это раньше?

ИЗДАНО ДЛЯ БОЛЬШЕ ДЕТАЛЕЙ:

Вот код десериализатора:

 String xmlString = _doc.ToString();
 StringReader sr = new StringReader(xmlString);            
 XmlReader xr = XmlReader.Create(sr);
 xs = new XmlSerializer(typeof(VideoAdServingTemplate<AdNode>));
 objVast = (VideoAdServingTemplate<AdNode>)xs.Deserialize(sr);

И рассматриваемый XML выглядит так:

<VideoAdServingTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast.xsd">
    <Ad id="myad">
        <InLine>
            <AdSystem>MyAdSystem</AdSystem>
            <AdTitle>Advertisement</AdTitle>
            <Description>Shamwow</Description>
            <Survey>
                <URL><![CDATA[http://www.dynamiclogic.com/tracker?campaignId=234&site=yahoo]]></URL>
            </Survey>
            <Error>
                <URL><![CDATA[http://www.primarysite.com/tracker?noPlay=true&impressionTracked=false]]></URL>
            </Error>
            <Impression>
                <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?imp]]></URL>
                <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?imp]]></URL>
            </Impression>
            <TrackingEvents>
                <Tracking event="start">
                    <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?start]]></URL>
                </Tracking>
                <Tracking event="midpoint">
                    <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?mid]]></URL>
                    <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?mid]]></URL>
                </Tracking>
                <Tracking event="firstQuartile">
                    <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?fqtl]]></URL>
                    <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?fqtl]]></URL>
                </Tracking>
                <Tracking event="thirdQuartile">
                    <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?tqtl]]></URL>
                    <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?tqtl]]></URL>
                </Tracking>
                <Tracking event="complete">
                    <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?comp]]></URL>
                    <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?comp]]></URL>
                </Tracking>
                <Tracking event="mute">
                    <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?mute]]></URL>
                </Tracking>
                <Tracking event="pause">
                    <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?pause]]></URL>
                </Tracking>
                <Tracking event="replay">
                    <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?replay]]></URL>
                </Tracking>
                <Tracking event="fullscreen">
                    <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?full]]></URL>
                </Tracking>
                <Tracking event="stop">
                    <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?stop]]></URL>
                </Tracking>
            </TrackingEvents>
            <Video>
                <Duration>00:00:15</Duration>
                <AdID>AdID</AdID>
                <VideoClicks>
                    <ClickThrough>
                        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?click]]></URL>
                    </ClickThrough>
                    <ClickTracking>
                        <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?click]]></URL>
                        <URL id="athirdadsever"><![CDATA[http://www.thirdparty.com/tracker?click]]></URL>
                    </ClickTracking>
                    <CustomClick>
                        <URL id="redclick"><![CDATA[http://www.thirdparty.com/tracker?click]]></URL>
                        <URL id="blueclick"><![CDATA[http://www.thirdparty.com/tracker?click]]></URL>
                    </CustomClick>
                </VideoClicks>
                <MediaFiles>
                    <MediaFile delivery="streaming" bitrate="250" width="200" height="200" type="video/x-flv">
                        <URL><![CDATA[rtmp://streamingserver/streamingpath/medium/filename.flv]]></URL>
                    </MediaFile>
<MediaFile delivery="progressive" bitrate="400" width="200" height="200" type="video/x-flv">
                        <URL><![CDATA[http://progressive.hostlocation.com//high/filename.flv]]></URL>
                    </MediaFile>
                    <MediaFile delivery="progressive" bitrate="200" width="200" height="200" type="video/x-flv">
                        <URL><![CDATA[http://progressive.hostlocation.com/progressivepath/medium/filename.flv]]></URL>
                    </MediaFile>
<!-- and a few more MediaFile tags -->
</MediaFiles>
</Video>

В XML есть немного больше, но он довольно большой, поэтому я многое из этого исключил. Я не уверен в порядке, в котором все десериализовано, все, что я знаю, это первая ошибка, которую я вижу после вызова xs.Deserialize ():

Unhandled Error in Silverlight 2 Application 
Code: 4004    
Category: ManagedRuntimeError       
Message: System.InvalidOperationException: There is an error in XML document (1, 7). ---> System.InvalidOperationException: <MediaFile xmlns=''> was not expected.
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderVideoAdServingTemplate1.Read27_VideoAdServingTemplate()
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, Object events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
   at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)

Нет никаких указаний на то, что ожидалось или почему этого не ожидалось.

Класс, который его реализует, имеет следующее определение для привязки тега к объекту:

 [System.Xml.Serialization.XmlArrayItemAttribute("MediaFile", typeof(MediaFile))]
    public MediaFile[] MediaFiles
    {
        get
        {
            return this.mediaFilesField;
        }
        set
        {
            this.mediaFilesField = value;
        }
    }

Я предполагаю, что [] в определении и использовании XmlArrayItemAttribute объясняется тем, что в строке несколько тегов MediaFile, поэтому они помещаются в массив. Я сгенерировал этот код с помощью xsd.exe и немного изменил его для работы в Silverlight.

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

Возможно, вам потребуется передать тип MediaFile в качестве KnownType в сериализатор:

var knownTypes = new Type[] { typeof(MediaFile) };
xs = new XmlSerializer(typeof(VideoAdServingTemplate<AdNode>), knownTypes);

В противном случае сериализатор не знает об этом новом типе.

0 голосов
/ 22 августа 2011

Я хотел бы убедиться, что XML действителен для той же схемы, которая использовалась для генерации ваших классов. Если проблема не устранена, опубликуйте все три набора файлов: XSD, XML и файл .cs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...