C#属性XmlIgnore和XamlWriter类 - XmlIgnore无法正常工作

时间:2011-01-01 20:09:58

标签: c# .net-4.0 xamlreader xmlignore

我有一个类,其中包含标记为Brush MyBrush的属性[XmlIgnore]。然而,它在流中被序列化,在尝试通过XamlReader读取时会造成麻烦。

我做了一些测试,例如当改变Property的可见性(到内部)时,它在流中消失了。不幸的是,我不能在我的特定情况下这样做。

  1. 有没有人有同样的问题?
  2. 你有没有办法解决这个问题?
  3. 备注:据我所知,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 Xaml Serialization");
    

    在我的一个课程中,我使用了属性Brush。在上面的代码中,单元测试失败,因为Brush对象(不可序列化)是值。当我移除Setter(如下所示)时,单元测试通过。

    使用XmlWriter(基本上与上面相同的测试)可行。在StringBuffer sb我可以看到Property Brush在Setter存在时被序列化而不是被删除(很可能是因为没有setter而忽略了Property的另一个检查)。 [XmlIgnore]的其他属性将按预期被忽略。

        [XmlIgnore]
        public Brush MyBrush
        {
            get { ..... }
            // removed because of problem with Serialization
            // set { ... }
        }
    

1 个答案:

答案 0 :(得分:14)

约翰的评论是正确的。还有(再次)其他属性。我在这里找到了这篇优秀的文章:http://blogs.msdn.com/b/mikehillberg/archive/2006/09/16/xamlwriter.aspx

之前我甚至遇到了属性[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] ,但将其误解为设计时属性。