让 XmlSerializer 也序列化类或结构的私有和“公共 const”属性的最简单方法是什么?对我来说,并非所有输出都是公开的。将其设为私有或添加 const 会导致值不被序列化。
6 回答
XmlSerializer
只查看公共字段和属性。如果您需要更多控制,您可以实现IXmlSerializable并序列化您想要的任何内容。当然,序列化一个常量没有多大意义,因为你不能反序列化为一个常量。
即使无法序列化私有属性,您也可以使用内部设置器序列化属性,如下所示:
public string Foo { get; internal set; }
为此,您需要使用 sgen.exe 预先生成序列化程序集,并将此程序集声明为朋友:
[assembly:InternalsVisibleTo("MyAssembly.XmlSerializers")]
查看 .NET 3.0 中引入的 DataContractSerializer。它也使用 XML 格式,并且在很多方面都优于 XmlSerializer,包括处理私有数据。有关完整比较,请参阅http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/。
如果您只有 .NET 2.0,则有可以处理私有数据的 BinarySerializer,但它当然是二进制格式。
考虑const
成员是没有意义的,因为它们不是每个实例;但如果您只是指非公共实例成员:考虑DataContractSerializer
(.NET 3.0) - 这类似于XmlSerializer
,但可以序列化非公共属性(尽管它是“选择加入”)。
请参阅此处了解更多信息。
另一种使用 Newtonsoft.Json 的解决方案:
var json = Newtonsoft.Json.JsonConvert.SerializeObject(new { root = result });
var xml = (XmlDocument)Newtonsoft.Json.JsonConvert.DeserializeXmlNode(json);
当然,这个不幸的是通过 json 绕道而行。
这是我将不可变值放入将序列化为 XML 的属性中的解决方案:
[XmlElement]
public string format { get { return "Acme Order Detail XML v3.4.5"; } set { } }