我有像这样的数据提取
[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。可能吗?怎么样?
答案 0 :(得分:6)
一种方法是将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;
}
这样,该属性不会在序列化时写入输出流。
答案 1 :(得分: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)
顺便说一句,无论可访问性如何,您都可以序列化字段和属性:private
,protected
,internal
,protected internal
或public
。您可以序列化任何读/写属性,而不仅仅是字段。关于集合类型的序列化,请参阅http://msdn.microsoft.com/en-us/library/aa347850.aspx。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
是的,我们可以防止属性被序列化。
在类上添加[DataContract]
注释,仅对序列化的属性添加[DataMember]
。如果要在该属性值为null时跳过该属性,则在该属性上放置[DataMember(EmitDefaultValue = false)]
。
示例:
[DataContract]
public class MyClass
{
[DataMember]
public int Id{ get; set; }
[DataMember]
public string Title { get; set; }
[DataMember]
public string MessageBody { get; set; }
[DataMember(EmitDefaultValue = false)]
public DateTime SentOn { get; set; }
}
注意:SentOn将在不为空时进行序列化,而其他将在每种情况下进行序列化。