2012-05-18 86 views
0

我有以下幾行代碼和問題。反序列化帶有泛型的複雜對象列表對象C#

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

任何幫助嗎?

+0

我的問題是arralist colecciones,成爲null反序列化不加載值 – NewCastle79

+0

現在我試圖解決使用linq2xml。 – NewCastle79

回答

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

任務完成設置的命名空間。