使用字段或属性作为xmlnode值

时间:2013-02-03 23:07:17

标签: c# xml xml-serialization

我正在尝试制作一个Angle类。当我将这个类序列化为xml我想跟随:

<Angle Unit="Degree">90</Angle>

or

<Angle Unit="Radian">3.14......</Angle>

目前,当我序列化我的课程时,我得到以下内容:

<Angle Unit="Degree">
  <Degree>90</Degree>
</Angle>

or

<Angle Unit="Radian">
  <Radian>90</Radian>
</Angle>  

我知道带有[XmlText]的字符串是可能的,但有没有办法获得double或其他值,而无需自定义xmlwrite和xmlread?

以下显示了我的类代码的一部分:

[Serializable]
public struct Angle
{
    [XmlAttribute]
    public UnitType Unit;

    public double Radian
    {
        get;
        set;
    }
    public bool ShouldSerializeRadian();

    public double Degree
    {
        get;
        set;
    }
    public bool ShouldSerializeDegree();
}

使用Unit和shouldSerialize我选择要使用的值。

当我设置度数= 90时,弧度的值将是1.5707 ......

UnitType是一个带有Degree和Radian的枚举。序列化时将使用unit = unittype.degree度,序列化时将使用unit = unittype.radian radain。

我用来选择我使用的代码的代码如下:

public bool ShouldSerializeRadian() 
{ 
   return (Unit == UnitType.Radian); 
}

1 个答案:

答案 0 :(得分:1)

不确定这是否是最佳解决方案,但您可以制作代理属性来处理Serilization / Deserialization。

喜欢的东西

[Serializable]
public class Angle 
{
    [XmlAttribute]
    public UnitType Unit;

    [XmlTextAttribute]
    public double Value
    {
        get { return Unit == UnitType.Degree ? Degree : Radian; }
        set
        {
            if (Unit == UnitType.Degree)
            {
                Degree = value;
                return;
            }
            Radian = value;
        }
    }

    [XmlIgnore]
    public double Radian { get; set; }

    [XmlIgnore]
    public double Degree { get; set; }
}

结果:

  <Angle Unit="Radian">70.8</Angle> 
  <Angle Unit="Degree">45.2</Angle>