【问题标题】:XML Serialization of public property backing private field in C#在 C# 中支持私有字段的公共属性的 XML 序列化
【发布时间】: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


【解决方案1】:

在这里检查这个答案:

Why are properties without a setter not serialized

当您具有“只读”属性时,这似乎是一个序列化程序限制(按设计),尝试添加一个“setter”,它可能会起作用。

【讨论】:

  • 谢谢!我非常确定它与私有字段有关,我从未想过查看可序列化属性是否可以是只读的。
【解决方案2】:

我相信只读属性不能被 XMLSerializer 序列化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2013-03-11
    • 2013-10-06
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多