Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

.net 4.0 - C# Attribute XmlIgnore and XamlWriter class - XmlIgnore not working

I have a class, containing a property Brush MyBrush marked as [XmlIgnore]. Nevertheless it is serialized in the stream causing trouble when trying to read via XamlReader.

I did some tests, e.g. when changing the visibility of the Property (to internal) it is gone in the stream. Unfortunately I cannot do this in my particular scenario.

  1. Did anybody have the same issue and?
  2. Do you see any way to work around this?

Remark: C# 4.0 as far I can tell

This is a method from my Unit Test where I do test the 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");

In one of my classes I use the Property Brush. In the above code this Unit Tests fails because a Brush object (not serializable) is the value. When I remove the Setter (as below), the Unit Test passes.

Using the XmlWriter (basically same test as above) it works. In the StringBuffer sb I can see that Property Brush is serialized when the Setter is there and not when removed (most likely another check ignoring the Property because of no setter). Other Properties with [XmlIgnore] are ignored as intended.

    [XmlIgnore]
    public Brush MyBrush
    {
        get { ..... }
        // removed because of problem with Serialization
        // set { ... }
    }
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

John's comment is correct. There are (again) other attributes. I found this excellent article here: http://blogs.msdn.com/b/mikehillberg/archive/2006/09/16/xamlwriter.aspx

I even came across the attribute [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] before , but misinterpreted it as a design time attribute.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...