如何通过重写对象序列化将多个属性组合到一个标记中

时间:2008-11-14 14:25:35

标签: c# xml-serialization

当我序列化时;

public class SpeedDial
{
    public string Value { get; set; }
    public string TextTR { get; set; }
    public string TextEN { get; set; }
    public string IconId { get; set; }
}

结果:

<SpeedDial>
    <Value>110</Value>
    <TextTR>Yangın</TextTR>
    <TextEN>Fire</TextEN>
    <IconId>39</IconId>
</SpeedDial>

但我想要的是:

  <speedDial>
    <value>110</value>
    <text>
      <TR>Yangın</TR>
      <EN>Fire</EN>
    </text>
    <iconId>39</iconId>
  </speedDial>

我想学习规范方式......

3 个答案:

答案 0 :(得分:2)

三种方法跳跃于脑海:

1:创建用于序列化的属性,并使用[XmlIgnore]隐藏其他属性 2:实施IXmlSerializable并自己动手 3:为序列化创建单独的DTO

这是一个将“文本”部分重新分解为XmlSerializer想要的对象,同时保留原始公共AIP的示例:

[Serializable]
public class SpeedDial
{
    static void Main()
    {
        XmlSerializer ser = new XmlSerializer(typeof(SpeedDial));
        SpeedDial foo = new SpeedDial { Value = "110", TextTR = "Yangin",
            TextEN = "Fire", IconId = "39" };
        ser.Serialize(Console.Out, foo);
    }
    public SpeedDial()
    {
        Text = new SpeedDialText();
    }

    [XmlElement("text"), EditorBrowsable(EditorBrowsableState.Never)]
    public SpeedDialText Text { get; set; }

    public string Value { get; set; }
    [XmlIgnore]
    public string TextTR
    {
        get { return Text.Tr; }
        set { Text.Tr = value; }
    }
    [XmlIgnore]
    public string TextEN
    {
        get { return Text.En; }
        set { Text.En = value; }
    }

    public string IconId { get; set; }
}
[Serializable]
public class SpeedDialText
{
    [XmlElement("EN")]
    public string En { get; set; }
    [XmlElement("TR")]
    public string Tr { get; set; }
}

答案 1 :(得分:1)

如果我是你,我不会这样做,因为你使你的序列化程序依赖于你的业务对象。对于小写,您可以使用xml-customattributes。

答案 2 :(得分:0)

public class SpeedDial
{
    public string Value { get; set; }
    public TextClass text;
    public string IconId { get; set; }
}

public class TextClass
{
    public string TR { get; set; }
    public string EN { get; set; }
}