【问题标题】:How to preserve default values in .net serialization如何在 .net 序列化中保留默认值
【发布时间】:2012-07-11 16:00:56
【问题描述】:

我将以下实体基类标记为可序列化:

[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。

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

谢谢

【问题讨论】:

    标签: c# xml-serialization


    【解决方案1】:

    它们没有这样的属性可以保留 public bool Is_ActiveNull 的默认值

    但是当像这样发生反序列化时你可以实现它

    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 practice

    不建议将 EmitDefaultValue 属性设置为 false 实践。只有在有特殊需要时才应该这样做 (例如为了互操作性或减少数据大小)。

    【讨论】:

    • 看来,此解决方案仅适用于 DataContractSerializer。我正在使用 XmlSerializer。这种类型的序列化也有解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 2011-07-13
    • 2016-05-11
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多