2012-07-11 28 views
0

我有以下实体基类标记为可序列:如何在.net序列保留默认值

[Serializable] 
public abstract class EntityBase 
{ 
    public bool Is_ActiveNull = true; 
    [XmlElement(ElementName = "Is_ActiveFromNull")] 
    ... 

我从基地实体继承,然后具体的实体:

[Serializable] 
public class ContactEntity : EntityBase 
{ 
... 

我有一个WCF服务,它使用此实体作为合同中的输入参数。

当我从客户端创建服务引用时,它会创建一个reference.cs,它会忽略字段Is_ActiveNull的默认值。

这是reference.cs文件EntityBase类:

public partial class EntityBase : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged 
{ 
    private bool Is_ActiveNullField; 

    [System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)] 
    public bool Is_ActiveNull { 
     get { 
      return this.Is_ActiveNullField; 
     } 
     set { 
      if ((this.Is_ActiveNullField.Equals(value) != true)) { 
       this.Is_ActiveNullField = value; 
       this.RaisePropertyChanged("Is_ActiveNull"); 
      } 
     } 
    } 
    ... 

在这种情况下Is_ActiveNullField被默认设置为false。

我的问题是如何保持默认值?

感谢

回答

0

他们没有这样的属性,以保障公众布尔Is_ActiveNull

的默认值但当Deseralizing发生这样

You will have to add EmitDefaultValue on you field 

[System.Runtime.Serialization.DataMemberAttribute(IsRequired=true, EmitDefaultValue=false)] 
    public bool Is_ActiveNull { 

and then 

[OnDeserializing] 
    void BeforeDeserialization(StreamingContext ctx) 
    { 
     this.Is_ActiveNull = false; 
    } 

心灵就可以实现它,你的MSDN也给EmitDefaultValue做一个Not on的练习

设置Emit DefaultValue属性为false不是推荐的 练习。只有在特定需要时才应该这样做 (如用于互操作性或减小数据大小)。

+0

看来,这种解决方案只适用于DataContractSerializer。我正在使用XmlSerializer。这种类型的序列化还有解决方案吗? – zosim 2012-07-11 08:12:52