2009-10-20 14 views
5

He estado serializando y deserializando objetos .net utilizando la clase XmlSerializer sin problema, sin embargo, ahora necesitamos que otra persona mire esos datos para realizar algún análisis sobre ellos..Net Serialización XML basada en un XSD?

Con el fin de ayudar con eso hemos producido un XSD basado en nuestra clase, así: xsd.exe/t: DATACLASS Assembly.exe

El inicio de la XSD se parece a esto:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="DataClass" nillable="true" type="DataClass" /> 
    <xs:complexType name="DataClass"> 
    <xs:complexContent mixed="false"> 
     <xs:extension base="BaseDataClass"> 
     <xs:sequence> 
      <xs:element minOccurs="0" maxOccurs="1" name="StudyID" type="xs:string" /> 
      <xs:element minOccurs="1" maxOccurs="1" name="Position" type="xs:int" /> 
      <xs:element minOccurs="1" maxOccurs="1" name="IViewer" type="xs:string" /> 

El XML se produce del modo siguiente (obj es una instancia de nuestra clase de datos):

Dim xs As New XmlSerializer(obj.GetType) 
Dim xmlTextWriter As New XmlTextWriter(memoryStream, Encoding.UTF8) 
xs.Serialize(xmlTextWriter, obj) 

... que produce XML con este aspecto:

<?xml version="1.0" encoding="utf-8"?> 
<DataClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Version>SixMonthQ-E1</Version> 
    <IViewer xsi:nil="true" /> 
    <Language xsi:nil="true" /> 
    ... 
    <StudyID>12345</StudyID> 

Bizarly, el XML producido no se adhiere al XSD generado de la misma clase.

Mi pregunta es, ¿hay alguna manera de decirle al XmlSerializer que serialice el objeto basándose en un XSD dado?

Como un lado, he visto otras formas de solucionar esto: He intentado volver a generar las clases desde el XSD generado - esto parecía tener el mismo problema. Podría indicar explícitamente un orden de elementos usando el atributo XmlElement, pero no me gusta hacerlo para más de 400 propiedades públicas.

+1

publica los detalles de las clases, y el XSD completo. Siempre debe serializar de acuerdo con este mismo XSD. –

+1

Lo siento, no puedo por eso, pero sí comencé a copiar las clases relevantes a un nuevo proyecto (con la intención de reducirlo a algo que podría publicar), y sorprendentemente, en el nuevo proyecto, el orden de los elementos en el XML rpoduced coincide con el orden de los elementos en el esquema. debe haber algo específico para ese proyecto que obligue a producir el XML en ese orden, ¿alguna idea de lo que podría afectar el orden? La otra cosa sobre el código actualizado, es que el XML contiene atributos xsi: nil = "true", pero el XSD generado no tiene atributos nillable = "true", ¡así que aún falla la validación! – Nik

Respuesta

4

No, lo siento. No parece que haya ninguna forma de forzar XmlSerializer a tener en cuenta un esquema.

Intente regenerar las clases utilizando xsd.exe y el esquema que generó (realizando una conversión de ida y vuelta).

xsd.exe dataClass.xsd /classes /language:cs 

Por lo menos, podría darle una idea de en qué aspecto de las clases originales tenía problemas el comando xsd.exe.

también quizás tratar esta alternativa a xsd: http://xsd2code.codeplex.com/

+0

xsd2code funcionó para mí, mientras que xsd.exe no pudo crear el código apropiado que luego falló con algunas excepciones raras en un proceso de serialización. – AgentFire