如何在序列化期间定义要在 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反序列化为对象结构。
希望我的帖子是可以理解的,并且我的问题得到了清晰的解释。 ;)
此致敬意!
假设您有某种方法可以从命令名称重建命令,则可以引入派生属性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
属性必须是公共属性才能正常工作。