将XmlSerializer与私有和公共const属性一起使用

时间:2009-01-09 19:32:51

标签: c# xml-serialization

让XmlSerializer同时序列化类或结构的私有和“公共const”属性的最简单方法是什么?对我而言,输出的并不仅仅是公开的。将其设为私有或添加const会导致值无法序列化。

6 个答案:

答案 0 :(得分:16)

XmlSerializer仅查看公共字段和属性。如果您需要更多控制权,可以实施IXmlSerializable并序列化您想要的任何内容。当然,序列化常量并没有多大意义,因为你不能反序列化为常量。

答案 1 :(得分:10)

即使无法序列化私有属性,也可以使用内部setter序列化属性,如下所示:

public string Foo { get; internal set; }

为此,您需要使用sgen.exe预生成序列化程序集,并将此程序集声明为朋友:

[assembly:InternalsVisibleTo("MyAssembly.XmlSerializers")]

答案 2 :(得分:3)

查看.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可以处理私有数据,但当然它是二进制格式。

答案 3 :(得分:2)

考虑const成员是没有意义的,因为它们不是每个实例;但是如果你只是指非公共实例成员:考虑DataContractSerializer(.NET 3.0) - 这类似于XmlSerializer,但可以序列化非公共属性(尽管它是“选择加入”)。

请参阅here for more

答案 4 :(得分:0)

使用Newtonsoft.Json的另一个解决方案:

   var json = Newtonsoft.Json.JsonConvert.SerializeObject(new { root = result });
   var xml = (XmlDocument)Newtonsoft.Json.JsonConvert.DeserializeXmlNode(json);

当然,不幸的是,这个人通过json绕道而行。

答案 5 :(得分:0)

这是我将不可变值放在将序列化为XML的属性中的解决方案:

[XmlElement]
public string format { get { return "Acme Order Detail XML v3.4.5"; } set { } }