I am writing a "Settings" class that uses XML Serialization, I need to use System.Drawing.Color variables which apparently do not serialize "out of the box", so a proxy string setter/getter needs to be made, and so the class is written (this is for a level editor):
public class Settings { private System.Drawing.Color gridPrimaryColor; private System.Drawing.Color gridSecondaryColor; private System.Drawing.Color gridTertiaryColor; private System.Drawing.Color viewBackgroundColor; [XmlIgnoreAttribute()] public System.Drawing.Color GridPrimaryColor { set { gridPrimaryColor = value; } get { return gridPrimaryColor; } } [XmlIgnoreAttribute()] public System.Drawing.Color GridSecondaryColor { set { gridSecondaryColor = value; } get { return gridSecondaryColor; } } [XmlIgnoreAttribute()] public System.Drawing.Color GridTertiaryColor { set { gridTertiaryColor = value; } get { return gridTertiaryColor; } } [XmlIgnoreAttribute()] public System.Drawing.Color ViewBackgroundColor { set { viewBackgroundColor = value; } get { return viewBackgroundColor; } } [XmlElement("GridPrimaryColor")] public string HTMLGridPrimaryColor { set { gridPrimaryColor = ColorTranslator.FromHtml(value); } get { return ColorTranslator.ToHtml(gridPrimaryColor); } } [XmlElement("GridSecondaryColor")] public string HTMLGridSecondaryColor { set { gridSecondaryColor = ColorTranslator.FromHtml(value); } get { return gridSecondaryColor; } } [XmlElement("GridTertiaryColor")] public string HTMLGridTertiaryColor { set { gridTertiaryColor = ColorTranslator.FromHtml(value); } get { return gridTertiaryColor; } } [XmlElement("ViewBackgroundColor")] public string HTMLViewBackgroundColor { set { viewBackgroundColor = ColorTranslator.FromHtml(value); } get { return viewBackgroundColor; } } }
Now thats a lot of code!, its there just to make a point, which is "there will be a lot of identically defined variables differing in name only".
Lets extract the code for a single variable:
private System.Drawing.Color viewBackgroundColor; [XmlIgnoreAttribute()] public System.Drawing.Color ViewBackgroundColor { set { viewBackgroundColor = value; } get { return viewBackgroundColor; } } [XmlElement("ViewBackgroundColor")] public string HTMLViewBackgroundColor { set { viewBackgroundColor = ColorTranslator.FromHtml(value); } get { return viewBackgroundColor; } }
Now, thats what it takes to define a single property variable thats serializable, wouldn't you just love to have the power of macros and do this (backslashes removed because of formating):
#define XMLITEM(INTERNAL,EXTERNAL) private System.Drawing.Color INTERNAL; [XmlIgnoreAttribute()] public System.Drawing.Color EXTERNAL { set { INTERNAL = value; } get { return INTERNAL; } } [XmlElement("EXTERNAL")] public string HTMLEXTERNAL { set { INTERNAL = ColorTranslator.FromHtml(value); } get { return INTERNAL; } }
and then just
public class Settings { XMLITEM(gridPrimaryColor) XMLITEM(gridSecondaryColor) XMLITEM(gridTertiaryColor) XMLITEM(viewBackgroundColor) }
I would.
Macros are prone to abuse, but they do have their uses.
[Serializable]
class someClass()
{
...
}
whether that would work for XML serialization i don't know suppose you could try:
[XMLSerializable]
class someClass()
{
...
}
just for kicks. seems daft that they make you go through so much trouble