如何在序列化期间定义在XML中属性的对象的行为

时间:2014-11-15 12:36:22

标签: c# xml serialization

将对象序列化为XML时遇到了一些问题。在开始时,这是类Order,它具有类型的一些属性,如string,int ...

public class Order
{
    [XmlAttribute("ObjectType")]
    public string TypeName
    {
        get; set;
    }

    [XmlAttribute("ID")]
    public string ID
    {
        get; set;
    }

    [XmlAttribute("TID")]
    public string TID
    {
        get; set;
    }

    [XmlAttribute("Command")]
    public Command Command
    {
        get; set; 
    }

    public Order()
    {

    }
}

如您所见,此类还有一个Command类型的属性。 Command类有一个名为Name的字符串属性:

public class Command
{
    [XmlAttribute("Name")]
    public string Name
    {
        get; set;
    }
}

问题是什么?我需要得到这样的结果:

<Order ObjectType="TestCase" ID="2" TID="W404" Command="SomeCommand" />

Where&#39; SomeCommand&#39;是&#39;姓名&#39;的价值此Command对象的属性。

用简单的话说:我需要定义如何将Command对象序列化为XML属性的行为 - 返回Name字符串。非常重要的是,我还必须能够将此XML反序列化为对象结构。

希望我的帖子可以理解,我的问题也清楚地解释了。 ;)

祝你好运!

1 个答案:

答案 0 :(得分:0)

假设您有某种方法可以从命令名重构命令,您可以引入派生属性CommandName来序列化名称,并使用xml serialization attributes使XmlSerializer输出所需的名称属性作为具有所需名称的属性:

public class Order
{
    [XmlAttribute("ObjectType")]
    public string TypeName
    {
        get;
        set;
    }

    [XmlAttribute("ID")]
    public string ID
    {
        get;
        set;
    }

    [XmlAttribute("TID")]
    public string TID
    {
        get;
        set;
    }

    [XmlIgnore]
    public Command Command
    {
        get;
        set;
    }

    [XmlAttribute("Command")]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    [Browsable(false)]
    public string CommandName
    {
        get
        {
            return Command == null ? null : Command.Name;
        }
        set
        {
            // Logic to convert CommandName to Command, e.g.:
            Command = Command.FindByName(value); // or whatever.
        }
    }

    public Order()
    {
    }
}

CommandName属性必须公开才能生效。