【问题标题】:XmlIgnore ONLY in SerializationXmlIgnore 仅在序列化中
【发布时间】:2014-09-24 18:51:23
【问题描述】:
        private string _password;

        public string Password
        {
            get 
            {
                return _password; 
            }
            set
            {
                if (_password != value)
                {
                    _password = PasswordEncryptor.Encode(value);
                    OnPropChanged("Password");                
                }
            }
        }

PasswordEncryptor 是我调用Encode 方法进行编码的类。而Password 编码后,由XmlSerializer 序列化为磁盘中的文件。但是,每次程序启动时,都会对文件进行反序列化,在setPasswordEncryptor.Encode()再次对Password进行编码。有没有办法我可以 [XmlIgnore] 仅在反序列化时使用它?

【问题讨论】:

    标签: c# xml serialization deserialization xmlignore


    【解决方案1】:

    XmlAttributeOverrides 可以在这种情况下提供帮助。

    来自MSDN

    允许您在使用时覆盖属性、字段和类属性 使用 XmlSerializer 序列化或反序列化对象

    使用它,我们可以在反序列化期间忽略特定属性。

    会是这样的……

    XmlElementAttribute attr = new XmlElementAttribute();
    attr.ElementName = "<elementName>";
    
    XmlAttributes attrs = new XmlAttributes();
    attrs.XmlIgnore = true;
    attrs.XmlElements.Add(attr);
    
    XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
    attrOverrides.Add(typeof(<className>), "<elementName>", attrs);
    
    // use this when deserializing
    XmlSerializer s = new XmlSerializer(typeof(<className>), attrOverrides);
    
    // use this when serializing
    XmlSerializer s = new XmlSerializer(typeof(<className>));
    

    【讨论】:

    • 但是我使用的 XmlSerializer 还序列化了许多其他属性,并且所有其他属性都需要序列化或反序列化。我怎样才能找出这个密码属性?
    • 只需使用不同的 XmlSerializer 进行序列化和反序列化。如果您希望对包括密码属性在内的所有属性进行序列化,只需使用 XmlSerializer 而不进行任何覆盖,并且不要在密码属性上指定 XmlIgnore。对于反序列化,请使用具有上述覆盖的 XmlSerializer。包括密码元素并将 XmlIgnore 属性设置为覆盖。
    • 是的,我希望将所有属性一起序列化,这样我就不会得到两个文件。第二个真是个好主意!我需要在 Password 属性上方标记一些东西吗?类似于 [XmlIgnore] 的东西,但在这种情况下除外?
    • 就像我在之前的评论中所说,您不需要在密码属性上设置任何内容,因为您会在覆盖时明确设置为忽略。
    • 我刚试过;它有点工作,但不完全。保存到磁盘的文件中的属性在反序列化过程中将被忽略,但它仍然会进入设置的内部属性并再次编码已经编码的密码。
    猜你喜欢
    • 2010-11-27
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2010-11-10
    • 2012-09-12
    相关资源
    最近更新 更多