2

次のように、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を取得します。

4

1 に答える 1

3

このような動作の理由は、XMLSerializerが、上記のコードのような値型のプロパティに対して、「Specified」キーワードで終わるこれらの追加のプロパティを使用するためbarですbarSpecifiedbarSpecifiedが「true」に設定されていない場合、barプロパティはシリアル化されません。これはXMLSerializerの言い方であり、bar一種のNULLであり、シリアル化するべきではありません。

それを解決するには、少なくとも3つの可能性があります。

-barSpecifiedプロパティとフィールドの削除

-「 true barSpecified」に設定

-クラス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);
                    }
                };
        }
    }
于 2013-01-14T10:41:51.917 に答える