7

让 XmlSerializer 也序列化类或结构的私有和“公共 const”属性的最简单方法是什么?对我来说,并非所有输出都是公开的。将其设为私有或添加 const 会导致值不被序列化。

4

6 回答 6

17

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

于 2009-01-09T19:43:54.207 回答
10

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

public string Foo { get; internal set; }

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

[assembly:InternalsVisibleTo("MyAssembly.XmlSerializers")]
于 2009-07-28T21:47:21.270 回答
4

查看 .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,但它当然是二进制格式。

于 2009-01-09T19:45:36.200 回答
2

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

请参阅此处了解更多信息

于 2009-01-09T20:16:15.063 回答
0

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

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

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

于 2016-04-14T08:52:03.080 回答
0

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

[XmlElement]
public string format { get { return "Acme Order Detail XML v3.4.5"; } set { } }
于 2017-11-08T16:33:07.677 回答