7

Brush MyBrushとしてマークされたプロパティを含むクラスがあります[XmlIgnore]。それにもかかわらず、ストリームでシリアル化されているため、を介して読み取ろうとすると問題が発生しますXamlReader

プロパティの可視性を(内部に)変更すると、ストリームに表示されなくなります。残念ながら、特定のシナリオではこれを行うことはできません。

  1. 誰かが同じ問題を抱えていましたか?
  2. これを回避する方法はありますか?

備考: 私が知る限り、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");

私のクラスの 1 つで、私は Property を使用しBrushます。Brush上記のコードでは、オブジェクト (シリアル化できない) が値であるため、この単体テストは失敗します。Setter を削除すると (以下のように)、単体テストに合格します。

XmlWriter(基本的に上記と同じテスト)を使用すると機能します。では、 Setter が存在するときにシリアル化され、削除されたときにシリアル化されていないStringBuffer sbことがわかりますProperty Brush(おそらく、Setter がないためにプロパティを無視する別のチェック)。のその他のプロパティ[XmlIgnore]は、意図したとおりに無視されます。

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

1 に答える 1

14

ジョンのコメントは正しいです。(再び)他の属性があります。ここでこの優れた記事を見つけました: http://blogs.msdn.com/b/mikehillberg/archive/2006/09/16/xamlwriter.aspx

以前にもこの属性に出くわしました[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]が、設計時の属性と誤解していました。

于 2011-01-03T09:50:18.933 に答える