将类序列化为属性

时间:2014-07-17 14:17:35

标签: c# xml-serialization

我有一个Point类,我想将其序列化为属性。以下是我真正想要的例子:

public class PointXY
{
    [XmlIgnore]
    public Double X { get; set; }

    [XmlIgnore]
    public Double Y { get; set; }

    public override string ToString()
    {
        return Points;
    }
}

public class TestClass
{
    [XmlAttribute]
    public PointXY Points { get; set; }
}

测试类应序列化为:

<TestClass Points="0.1 0.2">

</TestClass>

我知道如果使用IXmlSerializable接口实现TestClass,就可以实现这一点。但是我想要PointXY应该将自己作为属性而不是元素。可能吗?如果有,怎么样?这也应该反序列化。

2 个答案:

答案 0 :(得分:1)

我不知道将整个类序列化为属性的方法。

您必须要实施IXmlSerializable或将属性添加到TestClass并将序列化作为属性:

public class TestClass
{
    [XmlIgnore]
    public PointXY Points { get; set; }

    [XmlAttribute("Points")]
    public string PointString
    {
        get
        {
            return string.Format("{0} {1}",Points.X, Points.Y);
        }
        set
        {
            // TODO:  Add null checking, validation, etc.
            string[] parts = value.Split(' ');
            Points = new PointXY {X = double.Parse(parts[0]), Y = double.Parse(parts[1])};
        }
    }
}

答案 1 :(得分:0)

复杂对象通常被序列化为XML元素。遗憾的是,您无法在复杂类型上设置XmlAttribute,否则您将获得运行时异常。如果你绝对必须在这里使用Xml属性,你可以创建一个虚拟属性,它只返回你需要的数据。使用此代码:

public class TestClass
{
    [XmlAttribute(@"Points")]
    public string PointsString
    {
        get { return Points.ToString(); }
        set { throw new NotSupportedException(); }
    }

    [XmlIgnore]
    public PointXY Points { get; set; }
}