在不使用属性的情况下将对象序列化为XML

时间:2014-09-15 12:20:55

标签: c# xml

是否可以在不指定任何序列化属性的情况下控制XmlSerializer / DataContractSerializer行为?

更具体地说,我想控制序列化(XmlIgnore,自定义属性名称等),但不修饰我的属性。 使用案例:

  • 一个大型的现有类,我不希望污染序列化属性
  • 序列化没有源代码的类
  • 从使用XmlSerializer切换到DataContractSerializer到JSON而不更改类代码

例如,如何在不取消注释属性的情况下序列化以下内容:

// [Serializable]
public MyClass
{
    // [XmlIgnore] - The following property should not be serialized, without uncommenting this line
    public int DontSerializeMeEvenThoughImPublic { get; set; }

    // [XmlAttribute("another_name")] - should be serialized as 'another_name', not 'SerializeMeAsXmlAttribute'
    public double SerializeMeAsXmlAttribute { get; set; }

    // [DataMember] - should be included
    private string IWantToBeSerializedButDontDecorateMeWithDataMember { get; set; }
}

3 个答案:

答案 0 :(得分:3)

你不能(优雅地做) 修改XmlSerializer序列化类的方式的唯一方法是使用属性(顺便提一下SerializableAttribute)。 DataContractSerializer更糟糕。

一种可能的解决方案是为XML序列化/去序列化创建中间类,并使用Automapper在“真实”类和中介之间复制数据。 我已经使用这种方法将前端XML序列化问题保留在业务逻辑数据类型之外。

答案 1 :(得分:2)

通过XmlSerializer进行序列化应该没有属性。

答案 2 :(得分:2)

我知道这是一个老问题,但对于XmlSerializer部分,有趣的是没有人建议使用属性覆盖。

虽然没有解决私有属性,但AFAIK也不能用属性来解决,所以唯一的路由就是IXmlSerializable接口。

但是,通过添加属性可以做的事情也应该可以通过覆盖来实现。

以下内容适用于已注释的XmlAttributes反映的更改愿望:

public class Program
{
    public static void Main()
    {
        XmlAttributeOverrides overrides = new XmlAttributeOverrides();
        overrides.Add(typeof(MyClass), "DontSerializeMeEvenThoughImPublic", new XmlAttributes { XmlIgnore = true });
        overrides.Add(typeof(MyClass), "SerializeMeAsXmlAttribute", new XmlAttributes { XmlAttribute = new XmlAttributeAttribute("another_name") });
        XmlSerializer serializer = new XmlSerializer(typeof(MyClass), overrides);
        using (var writer = new StringWriter())
        {
            serializer.Serialize(writer, new MyClass());
            Console.WriteLine(writer.ToString());
        }
    }
}