【发布时间】:2014-04-25 17:40:16
【问题描述】:
我希望有人可以帮我解答这个问题,因为我整个上午都在努力寻找解决这个问题的方法。
我有一个需要序列化为 XML 的类。只要我序列化一个简单的公共属性,XML 序列化就可以工作。但是,如果我有一个 public 属性充当支持它的 private 字段 的吸气剂,则公共属性不会被序列化(尽管用 [XmlAttribute()] 装饰)。我梳理了 MSDN 和 StackOverflow 寻找答案,但无济于事。我在下面模拟了一个示例。
[Serializable()]
[XmlRoot("foobar")]
public class FooBar
{
[XmlAttribute("foo")]
public string Foo { get; set; }
private bool bar;
[XmlAttribute("bar")]
public string Bar
{
get { return ConvertBoolToYesNo(bar); }
}
public FooBar()
{
Foo = "foo";
bar = true;
}
public string ConvertBoolToYesNo(bool boolToConvert)
{
if(boolToConvert == true)
return "yes";
else
return "no";
}
}
当我希望它返回 <?xml version="1.0" encoding="us-ascii"?><foobar foo="foo" bar="yes" /> 时,它返回 <?xml version="1.0" encoding="us-ascii"?><foobar foo="foo" />。任何建议,将不胜感激。
提前致谢!
【问题讨论】:
-
您确实注意到
bar是只读的,对吧? -
与问题无关(已在下面回答),但在使用
XmlSerializer时,您的类不需要Serializable属性。 -
@ChrisSinclair 很高兴知道。我很感激。这是我第一次使用 XmlSerializer 而不是自己创建 XML 文档。以后我会注意的。
-
您是否仅限于
XmlSerializer? IIRC(?),WCF 的 XML 合同序列化程序允许序列化私有成员,从而在不创建 setter 的情况下解决它,从而使属性成为非只读的。您的另一个选择是实施IXmlSerializable来自己管理私有字段的反序列化。 -
@LB2 不幸的是,
XmlSerializer在这种情况下是必要的(除非我想手动处理构建 XML 文档,我宁愿避免这种情况。但是,允许设置它们不会有什么坏处任何东西 - 鉴于范围,它只是没有必要,所以我避免这样做。
标签: c# .net xml-serialization