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>

うん!

SizeのプロパティとLocationプロパティを抑制するか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、で飾る必要のある4つの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 に答える