我有一个类,包含Brush MyBrush标记为的属性[XmlIgnore].然而,它在流中被序列化,在尝试读取时会导致麻烦XamlReader.
我做了一些测试,例如当改变Property的可见性(到内部)时,它在流中消失了.不幸的是,我不能在我的特定场景中这样做.
备注:据我所知,C#4.0
这是我的单元测试中的一个方法,我在那里测试XamlSerialization:
// buffer to a StringBuilder
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb, settings);
XamlDesignerSerializationManager manager = new XamlDesignerSerializationManager(writer) {XamlWriterMode = XamlWriterMode.Expression};
XamlWriter.Save(testObject, manager);
xml = sb.ToString();
Assert.IsTrue(!String.IsNullOrEmpty(xml) && !String.IsNullOrEmpty(xml), "Xaml Serialization failed for " + testObject.GetType() + " no xml string available");
xml = sb.ToString();
MemoryStream ms = xml.StringToStream();
object root = XamlReader.Load(ms);
Assert.IsTrue(root != null, "After reading from MemoryStream no result for …Run Code Online (Sandbox Code Playgroud) 我是否正确理解.NET XmlIgnoreAttribute,它说:
指示XmlSerializer的Serialize方法不要序列化公共字段或公共读/写属性值.
那:
我问的原因是我用一个带有更多选项的新属性替换了文件中的属性.旧属性是一个简单的布尔属性,新属性是枚举.我已经更改了旧属性,以便将新属性的值转换为布尔值,根据旧属性在添加新属性之前的含义,get和set都已实现.
这允许我通过读取设置新属性的旧属性来静默升级新文件,并在序列化时添加新属性.
但是,我想从新的xml文件中删除旧属性,所以我想知道如果我用它标记它会发生什么[XmlIgnore],旧的xml文件是否仍然正确地反序列化并从文件中读取该属性,或者它会被完全忽略?
如果没有,以下变化会做我想要的吗?
[XmlAttribute("is-list")]
[DefaultValue(false)]
public bool IsList
{
get { return false; }
set {
if (value)
ListHandling = ListHandling.All;
}
}
Run Code Online (Sandbox Code Playgroud)
对于所有新对象,这将返回false,因为我已经指定了默认值,并且如果存在于旧文件中,并且设置为true,则会更改ListHandling属性,这将是重要的新属性.
编辑:经过测试,我已经确认这两种方法似乎都符合我的要求.我会留下这个问题,因为我仍然想知道上面提到的第一个行为是否只是一个实现细节,或者是否可以通过这种方式理解文档.
我试图使用XmlAttributeOverrides来控制哪些类属性在序列化后显示在xml中。它适用于“根”类上的属性,但不适用于嵌套属性。这是一个简单的示例,以说明我要完成的工作。
我的班级层次结构如下:
public class Main
{
public string Name { get; set; }
public Location Address { get; set; }
}
public class Location
{
public string StreetAddress { get; set; }
public Contact ContactInfo{ get; set; }
}
public class Contact
{
public string PhoneNumber { get; set; }
public string EmailAddr { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我序列化Main()时,我得到如下信息:
<Main>
<Name></Name>
<Address>
<StreetAddress></StreetAddress>
<ContactInfo>
<PhoneNumber></PhoneNumber>
<EmailAddr></EmailAddr>
</ContactInfo>
</Address>
</Main>
Run Code Online (Sandbox Code Playgroud)
我所能做的就是通过使用以下命令来避免显示名称或地址:
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes(); …Run Code Online (Sandbox Code Playgroud)