XMLSerializer不会序列化类属性,只返回bool - *指定成员的'false'值

时间:2013-01-11 15:41:43

标签: c# xml-serialization

让WCF / svcutil.exe自动生成类代码:

public class Foo
{

    private float barField;

    bool barFieldSpecified;

    public float bar
    {
        get
        {
            return this.barField;
        }
        set
        {
            this.barField = value;
        }
    }

    [System.Xml.Serialization.SoapIgnore]
    public bool barSpecified
    {
        get
        {
            return this.barFieldSpecified;
        }
        set
        {
            this.barFieldSpecified = value;
        }
    }        
} 

并使用XMLSerializer:

        Foo foo = new Foo();
        foo.bar = 100;
        var ser = new XmlSerializer(typeof(Foo));
        var ms = new MemoryStream();
        ser.Serialize(ms, foo);
        var str = Encoding.UTF8.GetString(ms.ToArray()); 

我使用设置为'false'的所有节点中的值获取XML,并且没有设置我的类属性。

1 个答案:

答案 0 :(得分:0)

此类行为的原因是XMLSerializer在上面的代码中使用这些附加属性以“指定”关键字结尾,用于值类型属性,如barbarSpecified。如果barSpecified未设置为“true”,则bar属性将不会被序列化。这是XMLSerializer的说法,bar是一种NULL,不应该被序列化。

解决这个问题至少有3种可能性:

- 删除barSpecified属性和字段

- 将barSpecified设置为'true'

-if类实现INotifyPropertyChanged使用它(如果类是自动生成的,最好将它作为另一个文件中的部分类,如下所示):

   public partial class Foo
   {
        public Foo()
        {
            this.PropertyChanged += (object sender, System.ComponentModel.PropertyChangedEventArgs e) =>
                {
                    if (!e.PropertyName.EndsWith("Specified"))
                    {
                        var prop = this.GetType().GetProperty(e.PropertyName + "Specified");
                        if (prop != null)
                            prop.SetValue(this, true, null);
                    }
                };
        }
    }