Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I prevent a specific datamember from being deserialized?

I have a datacontract like this

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

    [DataMember]
    public string DM2;

    [DataMember]
    public string DM3;
}

and sometimes I want to prevent DM2 from being deserialized when being returned from an OperationContract. Something like this:

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

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

    return mdc;
}

I could always make a new DataContract that has only DM1 and DM3 and generate that from the MyDC instance but I want to see if it is possible to programatically remove DM2. Is it possible? How?

like image 744
floatingfrisbee Avatar asked Jul 29 '10 00:07

floatingfrisbee


1 Answers

One way to do this is to set the EmitDefaultValue property of the DataMemberAttribute to false:

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

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

    [DataMember]
    public string DM3;
}

Then setting this property to null:

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

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

    return mdc;
}

This way, that property doesn't get written to the output stream on serialization.

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

like image 123
RQDQ Avatar answered Oct 16 '22 00:10

RQDQ