Eric
Eric

Reputation: 11662

XmlSerializer chokes on xsi:type?

EDIT: See Pavel's answer below -- the 'type not recognized error' was caused by a mismatch between the class heirarchy in my parsing code (which I did not include here) and my XML schema. The 'type not recognized' error was something of a red herring, but once I fixed things the parsing works just fine. If you get to this question because you've googled for that error message, triple-check your heirarchies!

I have the XML file shown below. When I view it in VS2008, Intellisense does not report any errors. However when I try to parse it with XmlSerializer.Deserialize, I get the exception:

The specified type was not recognized: name='UTCTimeStamp_t', namespace='http://www.fixprotocol.org/ATDL-1-1/Core', at <Parameter xmlns='http://www.fixprotocol.org/ATDL-1-1/Core'>.

(The offending xsi:Type, "UTCTimeStamp_t", is defined in the referenced XSD file as shown below the XML.)

Why does XmlSerializer reject the XML even though Intellisense shows it as being valid? (I double-checked that both are getting the same copy of the XSD file.)

Is there a change I can make, or a workaround I can apply, to get this to parse?

NOTE: I am doing this in Silverlight3 -- are there any particular limitations to that version of the serializer?

Here's the XML:

<?xml version="1.0" encoding="utf-8"?>
<Strategies
 xmlns="http://www.fixprotocol.org/ATDL-1-1/Core"
  xmlns:core="http://www.fixprotocol.org/ATDL-1-1/Core"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xsi:schemaLocation="http://www.fixprotocol.org/ATDL-1-1/Core http://www.myserver.com/atdl-core-1-1.xsd"
  strategyIdentifierTag="7620"
  >

  <Strategy name="Tazer1" uiRep="Tazer" wireValue="Tazer" version="1" fixMsgType="D" providerID="ABC">

    <Parameter name="StartTime" xsi:type="core:UTCTimeStamp_t" fixTag="7602" use="required" localMktTz="America/New_York">
      <Description>Strategy Start Time</Description>
    </Parameter>
  </Strategy>

</Strategies>

Here's the snippet of the XSD file:

  <xs:complexType name="UTCTimeStamp_t">
    <xs:complexContent>
      <xs:extension base="core:Parameter_t">
        <xs:attribute name="minValue" type="core:UTCTimeStamp"/>
        <xs:attribute name="maxValue" type="core:UTCTimeStamp"/>
        <xs:attribute name="dailyMinValue" type="core:LocalMktTime"/>
        <xs:attribute name="dailyMaxValue" type="core:LocalMktTime"/>
        <xs:attribute name="localMktTz" type="xs:string">
          <xs:annotation>
            <xs:documentation>
              These string values must correspond to time zone values from the zoneinfo database,
              also known as the tz database.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="constValue" type="core:UTCTimeStamp"/>
        <xs:attribute name="dailyConstValue" type="core:LocalMktTime"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

Upvotes: 1

Views: 1542

Answers (1)

Pavel Minaev
Pavel Minaev

Reputation: 101635

XmlSerializer does not care about XML Schema definition of the type - all it cares about is the name of the type, and the class declaration that maps to it. It's not possible to say what the problem is without looking at the definition of the class(es) you're trying to deserialize, complete with their XML serialization attributes.

Upvotes: 2

Related Questions