如何使用XmlElementAttribute.Type属性序列化笔

本文关键字:序列化 属性 Type 何使用 XmlElementAttribute | 更新日期: 2023-09-27 18:26:24

我正在尝试序列化类中定义为Pen的一些属性。由于我想找到最简单、最优雅的方法来实现这一点,我尝试将本答案中描述的解决方案应用于Pen类型。我只需要串行化PenColorDashStyleWidth属性,所以我得到了以下类:

public class XmlPen {
    private Pen pen = new Pen(Color.Black, 1.0F);
    [XmlAttribute]
    public String ColorHtml {
        get { return ColorTranslator.ToHtml(this.pen.Color); }
        set { this.pen.Color = ColorTranslator.FromHtml(value); }
    }
    [XmlAttribute]
    public DashStyle Style {
        get { return this.pen.DashStyle; }
        set { this.pen.DashStyle = value; }
    }
    [XmlAttribute]
    public float Width {
        get { return this.pen.Width; }
        set { this.pen.Width = value; }
    }
    public XmlPen() {
    }
    public XmlPen(Pen pen) {
        this.pen = pen;
    }
    public static implicit operator Pen(XmlPen xmlPen) {
        return xmlPen.pen;
    }
    public static implicit operator XmlPen(Pen pen) {
        return new XmlPen(pen);
    }
}

根据上面提到的答案,我只需要在我想要序列化的每个Pen属性前面添加以下属性:

[XmlElement(Type = typeof(XmlPen))]
public Pen SomePen { get; set; }

但这不起作用,当我试图序列化我的对象时,我得到了一个InvalidOperationException

System.Drawing.Pen无法序列化,因为它没有无参数构造函数。


我的问题是:

  1. 为什么我会出现此错误?[XmlElement(Type = typeof(XmlPen))]不是建议在(反)序列化Pen属性时应该使用XmlPen类吗
  2. 有没有一个技巧可以让我在没有无参数构造函数的类型上使用这个解决方案

PS:如果我必须在代码中的任何地方引用这个新类,我对将Pen类封装在另一个类中不感兴趣,也不感兴趣在类中添加隐藏属性以在(反)序列化时使用。

如何使用XmlElementAttribute.Type属性序列化笔

Why am I getting this error?

因为在Pen类中没有parameter-less构造函数

Doesn't the [XmlElement(Type = typeof(XmlPen))] suggests that the XmlPen class should be used when (de)serializing the Pen property?

没有Pen是独立对象,Deserialization将需要在笔类中使用公共的无参数构造函数

编辑

评论问题

Isn't the serializer supposed to use the parameterless constructor of the XmlPen class?

否,因为您的public static implicit operator XmlPen(Pen pen)仍然需要一个Pen对象,该对象在序列化或反序列化对象时需要在运行时构造