2009-08-27 9 views
0

Quelqu'un peut-il me dire pourquoi cette classe nécessite [XmlInclude(typeof(AutoHedgerBaseDataObject))] de désérialiser correctement? Ce n'est pas clair pour moi.CSharp/DotNet: Sérialisation, Génériques et classes de base

[Serializable] 
[XmlInclude(typeof(AutoHedgerBaseDataObject))] 
public abstract class AutoHedgerCommandMessage 
{ 
    #region Variables 

    private string myUpdatedBy; 
    private string myUpdatedTime; 

    #endregion 

    #region Constructors 

    public AutoHedgerCommandMessage(string name)   
    { 
     myUpdatedBy = Environment.UserName; 
     myUpdatedTime = DateTime.Now.ToString("YYYYMMdd HH:mm:ss zzz"); 
    } 

    #endregion 

    #region Properties 

    [XmlElement("updated_by")] 
    public string UpdatedBy 
    { 
     get { return myUpdatedBy; } 
     set { myUpdatedBy = value; } 
    } 


    [XmlElement("updated_time")] 
    public string UpdatedTime 
    { 
     get { return myUpdatedTime; } 
     set { myUpdatedTime = value; } 
    } 


    #endregion 

    #region Methods 

    protected T[] ToArrayOfType<T>(IList<string> ids, string source) 
     where T : AutoHedgerBaseDataObject, new() 
    { 
     T[] list = new T[] { }; 
     if (ids != null) 
     { 
      list = new T[ids.Count]; 
      for (int i = 0; i < ids.Count; i++) 
      { 
       list[i] = new T(); 
       list[i].Id = ids[i]; 
       list[i].Source = source; 
      } 

     } 
     return list; 
    }  

    #endregion 
} 

Bien que nous ayons plusieurs classes qui héritent de cette classe de base, seul d'entre eux ne parvient pas à sérialiser sans XmlInclude et qui est une classe qui n'a pas de propriétés sérialisables ou de données et ne remet pas toutes les méthodes sur la base classe. Ceci est la classe qui ne désérialiser:

[Serializable()] 
[XmlRoot(ElementName = "command")] 
public class GetAutoHedgerHedgesCommand : AutoHedgerCommandMessage 
{ 
    #region Constructors 

    // Parameterless constructor for serialization/deserialization 
    public GetAutoHedgerHedgesCommand() 
     : base(Name) 
    { 
    } 

    #endregion 

    #region Constants 

    public const string Name = "get_autohedger_hedges"; 

    #endregion   
} 

Répondre

0

Vraisemblablement parce que quelque chose dans la classe de base ou la classe dérivée est à l'origine une liste d'éléments à sérialiser que vous na pas mentionné explicitement dans votre interface (cette classe elle-même ne marche pas exposer tout ce qui conduirait directement à la question).

This has been covered pretty completely in a previous question

Questions connexes