C# XmlIgnore仅用于序列化
C# XmlIgnore仅用于序列化,c#,xml,serialization,deserialization,xmlignore,C#,Xml,Serialization,Deserialization,Xmlignore,PasswordEncryptor是我调用Encode方法进行编码的一个类。在对密码进行编码后,它将由XmlSerializer序列化到磁盘中的文件中。但是,每次程序启动时,文件都被反序列化,并且在集合中,PasswordEncryptor.Encode()再次对密码进行编码。有没有一种方法可以只在反序列化中使用它?XmlAttributeOverrides在这种情况下会有所帮助 从 允许您在执行以下操作时重写属性、字段和类属性: 使用XmlSerializer序列化或反序列化对象 使用此选项,
PasswordEncryptor
是我调用Encode
方法进行编码的一个类。在对密码
进行编码后,它将由XmlSerializer
序列化到磁盘中的文件中。但是,每次程序启动时,文件都被反序列化,并且在集合中,PasswordEncryptor.Encode()
再次对密码进行编码。有没有一种方法可以只在反序列化中使用它?XmlAttributeOverrides
在这种情况下会有所帮助
从
允许您在执行以下操作时重写属性、字段和类属性:
使用XmlSerializer序列化或反序列化对象
使用此选项,我们可以在反序列化过程中忽略特定属性
会是这样的
private string _password;
public string Password
{
get
{
return _password;
}
set
{
if (_password != value)
{
_password = PasswordEncryptor.Encode(value);
OnPropChanged("Password");
}
}
}
xmlementattribute attr=new xmlementattribute();
attr.ElementName=“”;
XmlAttributes attrs=新的XmlAttributes();
attrs.XmlIgnore=true;
attrs.xmlements.Add(attr);
XmlAttributeOverrides attrOverrides=新的XmlAttributeOverrides();
Add(typeof(),“”,attrs);
//反序列化时使用此选项
XmlSerializer s=新的XmlSerializer(typeof(),attrOverrides);
//序列化时使用此选项
XmlSerializer s=新的XmlSerializer(typeof());
但我使用的XmlSerializer还可以序列化许多其他属性,所有其他属性都需要序列化或反序列化。如何将此密码属性挑出?只需使用不同的XmlSerializer进行序列化和反序列化。如果希望序列化包括password属性在内的所有属性,只需使用XmlSerializer而不进行任何重写,并且不要在password属性上指定XmlIgnore。对于反序列化,请使用具有上述覆盖的XmlSerializer。包括password元素并将XmlIgnore属性设置为overrides。是的,我希望所有属性一起序列化,这样我就不会得到两个文件。第二个真是个好主意!是否需要在Password属性上方标记某些内容?类似于[XmlIgnore]的内容,但不在本例中?正如我在前面的评论中所说,您不需要在password属性上设置任何内容,因为在重写时,您将显式地将其设置为ignore;这有点奏效,但并不完全奏效。在反序列化过程中,将忽略保存到磁盘的文件中的属性,但它仍会进入set inside属性并再次对已编码的密码进行编码。
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>));