[英]Serialize an object to XML without using attributes
是否可以在不指定任何序列化属性的情况下控制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序列化/ desrialization创造中级班和使用Automapper到“真正的”类和中介之间的数据复制。 我已经使用这种方法将前端XML序列化问题排除在我的业务逻辑数据类型之外。
通过XmlSerializer
序列化应该没有属性。
我知道这是一个老问题,但是对于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());
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.