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.可能吗?怎么样?
一种方法是将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
[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)
| 归档时间: |
|
| 查看次数: |
5188 次 |
| 最近记录: |