2017-09-08 12 views
0

모든 파생 클래스가 INotifyPropertyChanged 메서드 및 이벤트에 액세스 할 수 있도록 내 ModelBase 클래스에 INotifyPropertyChanged를 구현하고 있습니다.Caliburn.Micro IsNotifying 속성을 serialize하지 마십시오

IModelBase 인터페이스에서 INotifyPropertyChangedEx를 구현하고 내 ModelBase 클래스에서 PropertyChangedBase를 확장하여 프로젝트에서 Caliburn.Micro를 사용하고 있습니다.

PropertyChangedBase의 IsNotifying 속성이 내 모델과 직렬화되는 것을 제외하면이 모든 기능이 훌륭합니다. 나는 몇 가지 시도했지만 직렬화를 중지 할 수 없었습니다.

ModelBase에서 IsNotifying를 재정의하고 [XmlIgnore] 속성을 속성에 추가했습니다. 내 ModelBase 클래스에서 새 키워드를 사용하여 IsNotifying을 숨기려고했습니다. 이들 중 어느 것도 효과가 없었다.

github에서 PropertyChangedBase 코드를 복사하고 내 PropertyChangedBase 클래스에 넣은 다음 [XmlIgnore]를 IsNotifying 속성에 추가했습니다. 이것은 효과적이지만 이상적인 것은 아닙니다.

아이디어가 있으십니까? 이 작업을 수행 할 수 있습니까? 방금 Caliburn.Micro PropertyChangedBase를 사용하여 스크랩하고 내 도구를 구현해야합니까? INotifyPropertyChanged를 구현하는 것은 어렵지 않습니다. Caliburn.Micro에서 이미 라이브러리를 사용하고 있기 때문에 사용하려고했습니다.

이 콘솔

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을 쓰는 간단한 예입니다 귀하의 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

이며,이 시도 :

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

XmlAttributeOverrides 유형을 사용하면 xml을 사용하여 수행 할 수있는 모든 것을 사용자 정의 할 수 있습니다. serializer 속성 - 이지만 런타임에는입니다. 나는 알아 냈을 때 놀랐다.

추가 읽기 : 메모,이 속성은 기차 스매시 아니라고 직렬화 있다는 사실로 .NET Framework Documentation

+0

이것은 완벽합니다. 나는 그저 시험을 치렀고 필요한만큼 작동합니다. – Marc