Pregunta

El problema

Tengo un problema cuando mi Deserialize XML, no se está deserializado uno de los elementos secundarios. Es nula en la instancia de clase a pesar de ser poblado en el XML.

Un poco fondo

XsdObjectGenerator para crear clases Poco basado en mi .xsd. Yo era entonces capaz de deserializar el XML en una instancia de clase y el trabajo con los objetos.

Me modifed las clases autogenerados envolviéndolos en un espacio de nombres llamado 'TFS'.

En un momento determinado en el proyecto, me ha sido necesario a cabo uno de los elementos secundarios en su propio espacio de nombres denominado 'COM'.

La próxima vez me trató de deserializado el XML en una instancia de clase, no está siendo deserializar el elemento secundario.

Aquí está el fragmento pertinente del código de clase TFS con el espacio de nombres elemento secundario cambiado a COM. También incluye la OrdDtl elemento padre que permanece en el espacio de nombres de TFS.

[XmlRoot(ElementName="OrdDtl",Namespace=Declarations.SchemaVersion,IsNullable=false),Serializable]
    public class OrdDtl
    {
            [XmlElement(Type=typeof(COM.AcctSetup), ElementName="AcctSetup", IsNullable=false, Form=XmlSchemaForm.Qualified, Namespace = Declarations.SchemaVersion)]
        [EditorBrowsable(EditorBrowsableState.Advanced)]
            public COM.AcctSetup __AcctSetup;

        [XmlIgnore]
            public COM.AcctSetup AcctSetup
        {
            get
            {
                if (__AcctSetup == null) __AcctSetup = new COM.AcctSetup();     
                return __AcctSetup;
            }
            set {__AcctSetup = value;}
        }

Aquí está la declaración AcctSetup en el espacio de nombres COM que está contenido en su propio archivo:

[XmlRoot(ElementName = "AcctSetup", Namespace = Declarations.SchemaVersion, IsNullable = false), Serializable]
    public class AcctSetup
    {
......
}

y aquí está mi función deserializar:

public static T XMLStringToXMLObject<T>(string pXmlString)
    {
        T retVal = default(T);   

        try
        {
            XmlSerializer vSerializer = new XmlSerializer(typeof(T));
            MemoryStream vMemoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlString));
            XmlTextWriter vXmlTextWriter = new XmlTextWriter(vMemoryStream, Encoding.UTF8);
            retVal = (T)vSerializer.Deserialize(vMemoryStream);
        }
        catch (System.Exception ex)
        {
            if (ExceptionMain.LogException(ex))
                throw;
        }

        return retVal;
    }

Cualquier ayuda para conseguir el elemento COM.AcctSetup deserializar es muy apreciada. Que me haga saber si necesita información o código muestras adicionales.

¿Fue útil?

Solución

Me cuenta de esto. El archivo XML yo estaba tratando de deserializar contenía el siguiente atributo en el elemento raíz:

xmlns="tfs"

Por lo tanto, cada elemento en el archivo xml estaba bajo este espacio de nombres XML.

Mis cambios en el código estaban poniendo en esencia el elemento AcctSetup debajo de un espacio de nombres XML independiente 'com'. Por lo tanto, con el fin de deserializar un archivo, el archivo necesitaría los 'xmlns = 'TFS'' en el elemento raíz y un 'xmlns = 'com'' separados atributo en el atributo acctsetup niño.

Dado que este no era el formato del archivo que estaba recibiendo en los elementos padres superiores al elemento AcctSetup fueron deserializado en la instancia de clase.

Mi solución era mover la parte trasera elemento 'acctsetup' en la 'TFS' espacio de nombres de nuevo. En mi situación particular, el único inconveniente es un poco ligera de la duplicación de código - pero todo funciona de nuevo

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top