在不使用属性的情况下将对象序列化为XML
本文关键字:对象 序列化 XML 情况下 属性 | 更新日期: 2023-09-27 18:21:58
是否可以在不指定任何序列化属性的情况下控制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; }
}
你不能(优雅地做)
修改XmlSerializer
序列化类的方式的唯一方法是使用属性(不需要SerializableAttribute
)。DataContractSerializer
更糟糕。
一种可能的解决方案是为XML序列化/去序列化创建中间类,并使用Automapper在"真实"类和中介器之间复制数据。我使用这种方法将前端XML序列化问题排除在业务逻辑数据类型之外。
我知道这是一个老问题,但对于XmlSerializer部分,有趣的是没有人建议使用Attribute重写。
虽然没有解决Private属性,但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());
}
}
}
通过XmlSerializer
的序列化应该在没有属性的情况下工作。