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

本文关键字:对象 复杂 泛型 反序列化 | 更新日期: 2023-09-27 18:34:33

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

[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; }

有什么帮助吗?

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

我通过以下操作解决了我的问题。

[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; }

工作完成了。