5

私はこのようなデータ契約を結んでいます

[DataContract]
class MyDC 
{
    [DataMember]
    public string DM1;

    [DataMember]
    public string DM2;

    [DataMember]
    public string DM3;
}

また、OperationContractから返されるときにDM2が逆シリアル化されないようにしたい場合がありますこのようなもの:

[OperationContact]
public MyDC GetMyDC()
{
    MyDC mdc = new MyDC();

    if (condition)
    {
        // Code to prevent DM2 from being deserialized  
    }

    return mdc;
}

DM1とDM3のみを持つ新しいDataContractをいつでも作成し、それをMyDCインスタンスから生成できますが、プログラムでDM2を削除できるかどうかを確認したいと思います。出来ますか?どのように?

4

4 に答える 4

6

これを行う 1 つの方法は、DataMemberAttribute の EmitDefaultValue プロパティを false に設定することです。

[DataContract]
class MyDC 
{
    [DataMember]
    public string DM1;

    [DataMember(EmitDefaultValue = false)]
    public string DM2;

    [DataMember]
    public string DM3;
}

次に、このプロパティを null に設定します。

[OperationContact]
public MyDC GetMyDC()
{
    MyDC mdc = new MyDC();

    if (condition)
    {
        // Code to prevent DM2 from being deserialized  
        mdc.DM2 = null;
    }

    return mdc;
}

このようにして、そのプロパティはシリアル化時に出力ストリームに書き込まれません。

http://msdn.microsoft.com/en-us/library/aa347792.aspx

于 2010-08-10T13:20:14.307 に答える
3

あなたが意味するのはシリアライズであり、デシリアライズではありません。

クラスに属性を適用するシリアル化用のクラスを準備すると、[DataContract]属性を持つクラスのメンバーのみ[DataMember]がシリアル化されます。

[DataContract]
class MyDC 
{
    [DataMember]
    public string DM1;

    public string DM2;

    [DataMember]
    public string DM3;
}

より複雑なケースでは、 を使用する[IgnoreDataMember]ことで問題を解決できます。( http://msdn.microsoft.com/en-us/library/ms733127.aspxを参照)

ちなみに、アクセシビリティに関係なく、フィールドとプロパティをシリアル化できます: privateprotectedinternalprotected internal、またはpublic. フィールドだけでなく、任意の読み取り/書き込みプロパティをシリアル化できます。コレクション型のシリアル化については、http://msdn.microsoft.com/en-us/library/aa347850.aspxを参照してください。

于 2010-07-30T09:32:06.763 に答える
2
[DataContract]
class MyDC 
{
    [DataMember]
    public string DM1;

    public string DM2;

    public bool IsDM2Serializable;

    [DataMember(Name="DM2", EmitDefaultValue = false)]
    public string DM2SerializedConditionally
    {
        get
        {
            if(IsDM2Serializable)
                return null;
            return DM2;
        }
        set { DM2=value; }
    }

    [DataMember]
    public string DM3;
}

非表示にする必要がある場合は、IsDM2Serializable を false に設定します。

[OperationContact]
public MyDC GetMyDC()
{
    MyDC mdc = new MyDC();

    if (condition)
    {
        // Code to prevent DM2 from being serialized  
        mdc.IsDM2Serializable = false;
    }

    return mdc;
}
于 2012-11-06T18:30:19.643 に答える