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

本文关键字:属性 XML 对象 序列化 定义 | 更新日期: 2023-09-27 18:30:37

我在将对象序列化为 XML 时遇到一些问题。一开始,这是类 Order,它具有一些类型的属性,如字符串、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 类型的属性。命令类有一个名为 Name 的字符串属性:

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

怎么了?我需要得到这样的结果:

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

其中"SomeCommand"是此命令对象的"Name"属性的值。

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

希望我的帖子是可以理解的,并且我的问题得到了清晰的解释。 ;)

此致敬意!

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

假设您有某种方法可以从命令名称重建命令,则可以引入派生属性CommandName来序列化名称,并使用 xml 序列化属性使所需属性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属性必须是公共属性才能正常工作。