防止属性被序列化

本文关键字:序列化 属性 | 更新日期: 2023-09-27 18:16:49

我试了这样做:

    [NonSerialized]
    private string _DecodeText;
    public string DecodeText { get { return _DecodeText; } set { _DecodeText = value; } }

但是它不起作用。"DecodeText"仍在序列化文件中。如何防止属性序列化?

防止属性被序列化

我怀疑你正在使用XmlSerializer ?如果是,请使用[XmlIgnore]属性。

XmlSerializer序列化公共字段和属性时,这应该应用于属性而不是支持字段(而BinaryFormatter使用反射来获取私有字段-因此在使用BinaryFormatter时使用NonSerialized标记私有字段)。

我可以使用下面的代码而不用序列化属性(NET 4.0):

private string _DecodeText;
[System.Xml.Serialization.XmlIgnore]
public string DecodeText { get { return _DecodeText; } set { _DecodeText = value; } }

更新答案

[NonSerialized]属性在变量上而不是属性上,但它不能在属性上。所以这没有用。

防止属性被序列化的一种方法是添加一个方法
public bool ShouldSerializeDecodeText() {
   return false;
}

,这(至少对于XmlSerializer)将阻止属性被序列化。

如果您不想仅仅为了序列化而向类中添加大量方法,您可以尝试从它继承并将方法添加到派生类中。

hth,艾伦。

我建立在@John的答案之上并修改了ef。tt模板包含[System.Xml.Serialization.XmlIgnore]

代码

        foreach (var navigationProperty in navigationProperties)
        {
            if (navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many)
            {
#>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    [System.Xml.Serialization.XmlIgnore]
<#
            }
#>
    <#=codeStringGenerator.NavigationProperty(navigationProperty)#>
<#
        }

我想这段代码会对大家有所帮助。使用您声明的属性,并且您希望它仅被序列化。然后你应该添加一个方法返回类型为布尔和名称方法是ShouldSerialize作为前缀[NameProperty]。下面的草稿代码和Newtonsoft的链接参考:

public class DisplayFieldSetting
{
        public bool ShouldSerializeHidden()
        {
            return false;
        }
        public bool ShouldSerializeKeepOriginialColumnName()
        {
            return false;
        }

        public string Hidden { get; set; }
        public string KeepOriginialColumnName{ get; set; }
}