2017-09-08 25 views
0

Ich implementiere INotifyPropertyChanged in meiner ModelBase-Klasse, so dass alle meine abgeleiteten Klassen Zugriff auf die INotifyPropertyChanged-Methoden und -Ereignisse haben.Caliburn.Micro IsNotifying-Eigenschaft nicht serialisieren

Ich verwende Caliburn.Micro in meinem Projekt, also habe ich dies getan, indem ich INotifyPropertyChangedEx in meiner IModelBase-Schnittstelle implementiert und dann PropertyChangedBase in meiner ModelBase-Klasse erweitert habe.

Das alles funktioniert gut, außer dass die IsNotifying-Eigenschaft von PropertyChangedBase mit meinen Modellen serialisiert wird. Ich habe ein paar Dinge ausprobiert, aber ich war nicht in der Lage, die Serialisierung zu stoppen.

Ich habe versucht, IsNotifying in ModelBase und hinzugefügt [XmlIgnore] zu der Eigenschaft. Ich habe auch versucht, IsNotify zu verbergen, indem ich das neue Schlüsselwort in meiner ModelBase-Klasse verwende. Keines von beiden hat funktioniert.

Ich habe den PropertyChangedBase-Code von github kopiert, in meine eigene PropertyChangedBase-Klasse eingefügt und dann [XmlIgnore] zur IsNotifying-Eigenschaft hinzugefügt. Das hat funktioniert, ist aber nicht ideal.

Irgendwelche Ideen? Kann das gemacht werden? Sollte ich nur mit der Caliburn.Micro PropertyChangedBase verschrotten und meine eigene implementieren? Es ist nicht schwierig, INotifyPropertyChanged zu implementieren. Ich habe gerade versucht, das in Caliburn.Micro zu verwenden, da ich bereits die Bibliothek benutze.

Dies ist ein einfaches Beispiel, das die XML an die Konsole

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; } 
    } 
} 

Dies ist die Ausgabe

<?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

Als Hinweis, die Tatsache, dass es die Serialisierung, dass das Eigentum nicht ein Zug zerschlagen ist. Es verursacht keine Probleme mit meiner Anwendung. Es ist einfach nicht richtig, es dort zu haben. Wenn jemand anderes unser XML konsumieren würde, müssten wir ihm sagen, dass er diese Eigenschaft ignorieren soll. – Marc

Antwort

1

In Ihrem SerializeObject<T> Methode, versuchen Sie dies schreibt:

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

Die XmlAttributeOverrides Typ können Sie alles anpassen, was mit XML getan werden kann Serializer-Attribute - , aber zur Laufzeit. Ich war erstaunt, als ich es herausfand.

Weiterführende Literatur: .NET Framework Documentation

+0

Das ist perfekt. Ich habe es einfach getestet und es funktioniert wie gewünscht. – Marc

Verwandte Themen