我可以阻止特定数据库反序列化吗?

flo*_*bee 5 wcf serialization datacontract datamember

我有这样的数据提取

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

    [DataMember]
    public string DM2;

    [DataMember]
    public string DM3;
}
Run Code Online (Sandbox Code Playgroud)

有时我想,以防止DM2从一个OperationContract的返回时被反序列化.像这样的东西:

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

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

    return mdc;
}
Run Code Online (Sandbox Code Playgroud)

我总是可以创建一个只有DM1和DM3的新DataContract并从MyDC实例生成,但我想看看是否可以以编程方式删除DM2.可能吗?怎么样?

RQD*_*QDQ 6

一种方法是将DataMemberAttribute的EmitDefaultValue属性设置为false:

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

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

    [DataMember]
    public string DM3;
}
Run Code Online (Sandbox Code Playgroud)

然后将此属性设置为null:

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

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

    return mdc;
}
Run Code Online (Sandbox Code Playgroud)

这样,该属性不会在序列化时写入输出流.

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


Cop*_*ick 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;
}
Run Code Online (Sandbox Code Playgroud)

然后在需要隐藏时将 IsDM2Serializable 设置为 false:

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

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

    return mdc;
}
Run Code Online (Sandbox Code Playgroud)