2017-09-08 10 views
0

私のModelBaseクラスにINotifyPropertyChangedを実装しています。派生したすべてのクラスがINotifyPropertyChangedメソッドとイベントにアクセスできるようにします。Caliburn.Micro IsNotifyingプロパティをシリアル化しないでください。

IModelBaseインターフェイスでINotifyPropertyChangedExを実装し、ModelBaseクラスでPropertyChangedBaseを拡張することで、プロジェクトでCaliburn.Microを使用しています。

これはすべて機能しますが、PropertyChangedBaseのIsNotifyingプロパティがモデルでシリアル化されています。私はいくつかのことを試みましたが、シリアライズを止めることができませんでした。

ModelBaseでIsNotifyingをオーバーライドし、プロパティに[XmlIgnore]を追加しようとしました。私はまた、私のModelBaseクラスでnewキーワードを使ってIsNotifyingを隠してみました。どちらもうまくいきませんでした。

githubからPropertyChangedBaseコードをコピーし、それを自分自身のPropertyChangedBaseクラスに入れて、[XmlIgnore]をIsNotifyingプロパティに追加しました。これは機能しましたが、理想的ではありません。

アイデア?これはできますか? Caliburn.Micro PropertyChangedBaseを使用してスクラップし、自分で実装する必要がありますか? INotifyPropertyChangedを実装するのは難しくありません。私はすでにライブラリを使用しているので、Caliburn.Microでこれを使用しようとしていました。

これはこれは、出力あなたのSerializeObject<T>方法で

<?xml version="1.0" encoding="utf-16"?> 
<MyModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <IsNotifying>true</IsNotifying> 
    <SomeProperty>Test</SomeProperty> 
</MyModel> 
+0

注意点としては、それはそのプロパティをシリアル化だという事実は、列車のスマッシュではありません。私のアプリケーションに問題はありません。そこに置くのはちょうどいいことではありません。他の人がXMLを使用する場合、そのプロパティを無視するように指示する必要があります。 – Marc

答えて

1

あるコンソールに

using System; 
using System.IO; 
using System.Xml.Serialization; 
using Caliburn.Micro; 

namespace CaliburnPropertyChangedBase 
{ 
    internal class Program 
    { 
     private static void Main() 
     { 
      var myModel = new MyModel {SomeProperty = "Test"}; 

      Console.WriteLine(myModel.SerializeObject()); 
      Console.ReadKey(); 
     } 
    } 

    public static class XmlHelper 
    { 
     public static string SerializeObject<T>(this T toSerialize) 
     { 
      var xmlSerializer = new XmlSerializer(toSerialize.GetType()); 

      using (var textWriter = new StringWriter()) 
      { 
       xmlSerializer.Serialize(textWriter, toSerialize); 
       return textWriter.ToString(); 
      } 
     } 
    } 

    public interface IModelBase : INotifyPropertyChangedEx 
    { 
    } 

    public class ModelBase : PropertyChangedBase, IModelBase 
    { 
    } 

    public interface IMyModel : IModelBase 
    { 
     string SomeProperty { get; set; } 
    } 

    public class MyModel : ModelBase, IMyModel 
    { 
     public string SomeProperty { get; set; } 
    } 
} 

をXMLを書き込み、簡単な例であり、これを試してみてください。

var overrides = new XmlAttributeOverrides(); 
overrides.Add(typeof(PropertyChangedBase), "IsNotifying", new XmlAttributes 
{ 
    XmlIgnore = true, 
}); 
var xmlSerializer = new XmlSerializer(toSerialize.GetType(), overrides); 

XmlAttributeOverridesタイプを使用すると、xmlを使用して実行できるすべてをカスタマイズできますシリアライザの属性 - ですが、実行時にはです。私が見つけたとき私は驚いた。

さらに読書:.NET Framework Documentation

+0

これは完璧です。私はちょうどそれにテストを与え、それは必要に応じて動作します。 – Marc

関連する問題