使用泛型List对象C#反序列化复杂对象

时间:2012-05-18 15:46:00

标签: c# xml-serialization xml-deserialization

我有以下几行代码和问题。

[Serializable, XmlRoot(Namespace = "http://www.asd.com", ElementName = "DalClassObject", IsNullable = true)]
[XmlType(AnonymousType = true)]
public class DalClassObject<T> 
{
    public DalClassObject()
    { }

    [XmlElement(ElementName = "objeto", IsNullable = true)] 
    public T Objeto { get; set; }
    [XmlElement(ElementName = "indicador")] 
    public Int32 Indicador { get; set; }
    [XmlElement(ElementName = "validador")] 
    public Boolean Validador { get; set; }
    [XmlElement(ElementName = "mensaje")] 
    public String Mensaje { get; set; }
    //[XmlElement(ElementName = "coleccion")] 
    [XmlArray("colecciones")]
    [XmlArrayItem] 
    public List<T> Colecciones { get; set; }

}

[Serializable, XmlRoot("botblpacientes")] 
public class BoTblPacientes
{
    [XmlElement(ElementName = "tblPacientesID")] 
    public String tblPacientesID { get; set; }

    [XmlElement(ElementName = "tblPacientesApellidos")] 
    public String tblPacientesApellidos { get; set; }

    [XmlElement(ElementName = "tblPacientesNombres")] 
    public String tblPacientesNombres { get; set; }

    [XmlElement(ElementName = "tblPacientesDocumento")] 
    public String tblPacientesDocumento { get; set; }

    [XmlElement(ElementName = "tblPacientesCorreo")] 
    public String tblPacientesCorreo { get; set; }

    [XmlElement(ElementName = "tblPacientesFoto")] 
    public byte[] tblPacientesFoto { get; set; }

    [XmlElement(ElementName = "tblPacientesDireccion")] 
    public String tblPacientesDireccion { get; set; }

    [XmlElement(ElementName = "tblPacientesEstadoCivil")] 
    public Int32 tblPacientesEstadoCivil { get; set; }

    [XmlElement(ElementName = "tblPacientesFechaNacimiento")] 
    public DateTime tblPacientesFechaNacimiento { get; set; }

    [XmlElement(ElementName = "tblPacientesSexo")] 
    public Int32 tblPacientesSexo { get; set; }

    [XmlElement(ElementName = "tblPacientesTlfCasa")] 
    public String tblPacientesTlfCasa { get; set; }

    [XmlElement(ElementName = "tblPacientesTlfCelular")] 
    public String tblPacientesTlfCelular { get; set; }

    [XmlElement(ElementName = "tblPacientesTlfOficina")] 
    public String tblPacientesTlfOficina { get; set; }

    [XmlElement(ElementName = "tblPacientesLugarNacimiento")] 
    public String tblPacientesLugarNacimiento { get; set; }

    [XmlElement(ElementName = "tblPacientesMotivoConsulta")] 
    public String tblPacientesMotivoConsulta { get; set; }

    [XmlElement(ElementName = "tblPacientesFechaRegistro")] 
    public DateTime tblPacientesFechaRegistro { get; set; }

    [XmlElement(ElementName = "tblPacientesIDMaster")] 
    public Int32 tblPacientesIDMaster { get; set; }
}


    public static T DeserializeObject<T>(string xml)
    {
        XmlSerializer xs = new XmlSerializer(typeof(T));
        MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(xml));
        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
        return (T)xs.Deserialize(memoryStream);
    }


    private static Byte[] StringToUTF8ByteArray(string pXmlString)
    {
        UTF8Encoding encoding = new UTF8Encoding();
        byte[] byteArray = encoding.GetBytes(pXmlString);
        return byteArray;
    }

我使用以下内容反序列化,在简历中

    DalClassObject<BoTblPacientes> objeto = new DalClassObject<BoTblPacientes>();
    objeto.Objeto = new BoTblPacientes();
    objeto.Colecciones = new List<BoTblPacientes>();
    String valor = String.Empty;

    objeto = UtilClassSerializacion.DeserializeObject<DalClassObject<BoTblPacientes>>(reader[0].ToString());

当我检查objeto.Collecciones的值时,我看到的是值,但所有值都是空的。如果返回2个值,则全部变为空。 我的序列化有什么问题?我尝试使用xmlelement,xmlarray,xmlarrayitem。

我的xml对象是

    <?xml version="1.0" ?>
    <DalClassObject xmlns="http://www.asd.com"><objeto class="BoTblPacientes"></objeto>
    <validador>true</validador><mensaje>El paciente  existe en el sistema .</mensaje>
    <colecciones>
    <BoTblPacientes>
    <tblpacientesmotivoconsulta>5</tblpacientesmotivoconsulta><tblpacientestlfcasa>5</tblpacientestlfcasa>
    <tblpacientescelular>5</tblpacientescelular><tblpacientesoficina>5</tblpacientesoficina>
    <tblpacientescorreo>5</tblpacientescorreo><tblpacientesdireccion>5</tblpacientesdireccion>
    <tblpacientesapellidos>5</tblpacientesapellidos><tblpacientesdocumento>5</tblpacientesdocumento>
    <tblpacientessexoid>0</tblpacientessexoid><tblpacientesfechanacimiento class="sql-date">2012-05-13</tblpacientesfechanacimiento>
    <tblpacientesnombres>5</tblpacientesnombres><tblpacientesid>2</tblpacientesid><tblpacientesestadocivil>0</tblpacientesestadocivil>
    <tblpacientesfecharegistro class="sql-date">2012-05-13</tblpacientesfecharegistro><tblpacienteidmaster>0</tblpacienteidmaster>
    </BoTblPacientes>
    <BoTblPacientes>
    <tblpacientesmotivoconsulta>23232</tblpacientesmotivoconsulta><tblpacientestlfcasa>2332</tblpacientestlfcasa>
    <tblpacientescelular>23</tblpacientescelular><tblpacientesoficina>23</tblpacientesoficina><tblpacientescorreo>23</tblpacientescorreo>
    <tblpacientesdireccion>2323</tblpacientesdireccion><tblpacientesapellidos>ewr</tblpacientesapellidos>
    <tblpacientesdocumento>5</tblpacientesdocumento><tblpacientessexoid>0</tblpacientessexoid>
    <tblpacientesfechanacimiento class="sql-date">2012-03-29</tblpacientesfechanacimiento><tblpacientesnombres>wer</tblpacientesnombres>
    <tblpacientesid>3</tblpacientesid><tblpacientesestadocivil>0</tblpacientesestadocivil>
    <tblpacientesfecharegistro class="sql-date">2012-05-13</tblpacientesfecharegistro>
    <tblpacienteidmaster>0</tblpacienteidmaster>
    </BoTblPacientes></colecciones>
    </DalClassObject>

我测试但我的课程是通用的,我怎么说

    [XmlArray("colecciones")]
    [XmlArrayItem(Type=typeof(T))] // is this was possible my problem become solved but dont support Parameter as variable.
    public List<T> Colecciones { get; set; }

任何帮助?

1 个答案:

答案 0 :(得分:0)

我解决了以下问题。

[Serializable, XmlRoot(Namespace = "http://www.asd.com", ElementName = "botblpacientes", IsNullable = true)]
public class BoTblPacientes
{
   [XmlElement(ElementName = "tblpacientesid")]
    public Int32 tblpacientesid { get; set; }
       ...
    all the properties in lower case, due a xml has all in lower case. 
}

并在DalClassObject中,在xmlarrayitem中设置名称空间

[XmlArray(ElementName = "colecciones", IsNullable = true)]
[XmlArrayItem(Namespace = "http://www.asd.com", IsNullable = true)]            
public List<T> Colecciones { get; set; }

工作完成了。