3

我正在使用带有矩形的 xml 序列化,但这会产生一些讨厌的 XML ...

我的课是这样的:

    [Serializable]
    public class myObject
    {
       public Rectangle Region { get; set; }

       //Some other properties and methods...
    }

当我将它序列化为 XML 时,这给了我这个:

    <myObject>
      <Region>
        <Location>
          <X>141</X>
          <Y>93</Y>
        </Location>
        <Size>
          <Width>137</Width>
          <Height>15</Height>
        </Size>
        <X>141</X>
        <Y>93</Y>
        <Width>137</Width>
        <Height>15</Height>
      </Region>
      ...
    </myObject>

呸!

我希望我可以抑制SizeLocation上的属性Rectangle,或者使用支持变量并[XmlIgnore]最终得到如下结果:

    [Serializable]
    public class myObject
    {
       [XmlElement("????")]
       public int RegionX;

       [XmlElement("????")]
       public int RegionY;

       [XmlElement("????")]
       public int RegionHeight;

       [XmlElement("????")]
       public int RegionWidth;

       [XmlIgnore]
       public Rectangle Region {get { return new Rectangle(RegionX, RegionY, RegionWidth, RegionHeight);}

       //Some other properties and methods...
    }

希望能给我类似的东西:

    <myObject>
      <Region>
        <X>141</X>
        <Y>93</Y>
        <Width>137</Width>
        <Height>15</Height>
      </Region>
      ...
    </myObject>

代码不太好,但是 XML 将由人们编辑,所以最好能得到一些在那里工作的东西......

任何想法可能会出现在“????”中?或另一种方法?

我宁愿不必实现我自己的版本Rectangle...

4

1 回答 1

2

感谢您的评论,我结束了一种 DTO 路线-我实现了自己的 Struct- XmlRectangle,持有我需要装饰的四个 int 值[Serializable]。我添加了隐式转换运算符,因此我可以将其用作Rectangle

[Serializable]
public struct XmlRectangle
{
    #endregion Public Properties

    public int X {get; set; }
    public int Y {get; set; }
    public int Height { get; set; }
    public int Width { get; set; }

    #endregion Public Properties

    #region Implicit Conversion Operators

    public static implicit operator Rectangle(XmlRectangle xmlRectangle)
    {
        return new Rectangle(xmlRectangle.X, xmlRectangle.Y, xmlRectangle.Width, xmlRectangle.Height);
    }

    public static implicit operator XmlRectangle(Rectangle rectangle)
    {
        return result = new XmlRectangle(){ X = rectangle.X, Y = Rectangle.Y, Height = Rectangle.Height, width  = Rectangle.Width };
    }

    #endregion Implicit Conversion Operators
}

然后将其作为数据保存的类具有Rectangle将其作为XmlRectangle序列化器公开的属性,如下所示:

[XmlElement("Region",typeof(XmlRectangle))]
public Rectangle Region { get; set; }
于 2012-12-10T12:51:10.800 回答