CSharp / DotNet: сериализация, дженерики и базовые классы - PullRequest
0 голосов
/ 27 августа 2009

Может кто-нибудь сказать мне, почему этот класс требует [XmlInclude(typeof(AutoHedgerBaseDataObject))] для правильной десериализации? Это мне не понятно.

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

Хотя у нас есть несколько классов, которые наследуются от этого базового класса, только один из них не может сериализоваться без XmlInclude, и это класс, который не имеет сериализуемых свойств или данных и не вызывает никаких методов базового класса. Это класс, который не может десериализовать:

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

1 Ответ

0 голосов
/ 27 августа 2009

Предположительно, потому что что-то в базовом или производном классе вызывает сериализацию списка элементов, который вы явно не упомянули в своем интерфейсе (сам этот класс не предоставляет ничего, что могло бы непосредственно привести к проблеме).

Это было довольно полно рассмотрено в предыдущем вопросе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...