如何创建自定义XmlAttribute序列化

Sau*_*eil 8 c# xml-serialization

我正在寻找谁来定制属性的序列化.我觉得这很简单,但我无法达到我想要的方式.

所以这是一个简单的例子:

类定义:

Class MyClass
{
    [XmlAttribute("myAttribute")]
    public int[] MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想要的Xml结果:

<MyClass myAttribute="1 2 3... N" />
Run Code Online (Sandbox Code Playgroud)

我做的唯一工作就是放置[XmlIgnore]属性并使用一些执行转换的代码创建另一个属性.

所以,我的问题是,有没有比创建新房产更好的方法?也许你可以创建某种类型的TypeConverter,这样串行器就可以使用它?

另外,我尝试使用Type属性但没有成功.(总是得到例外).但是从我读过的内容来看,它已经定义了数据类型.

[XmlAttribute("myAttribute", typeof(MyConverter))]
public int[] MyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

另一个有趣的方式是这样的:

[XmlAttribute("myAttribute")]
[XmlConverter(typeof(MyConverter))]
public int[] MyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

谢谢.


编辑由于没有提供像我一样的解决方案,我最终决定选择"IXmlSerializable"解决方案.

Die*_*hon 3

您可以:

  1. 手动实现IXmlSerializable和处理您的类型的所有序列化/反序列化
  2. 使用代理属性:

    [XmlIgnore]
    public int[] MyProperty { get; set; }
    
    
    [XmlAttribute("myAttribute")]
    public string _MyProperty
    {
        get
        {
            return string.Join(" ", MyProperty.Select(x => x.ToString()).ToArray());
        }
        set
        {
            MyProperty = value.Split(' ').Select(x => int.Parse(x)).ToArray();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)