2015-04-06 55 views
3

Windows.Media.Brush不是一个可序列化的类,所以我想知道如何去序列化它。如何序列化Windows.Media.Brush

我把[Serializable]属性类本身和[DataContract]和使用[数据成员(名称=“属性名”)沿每个属性,因此它看起来是这样的:

[Serializable] 
[DataContract] 
public class ClassName: SerializeableBase<ClassName> 
{ 
    // Color 
    [DataMember(Name = "Color")] 
    private Brush _color; 
    public Brush Color 
    { 
     get { return _color; } 
     set 
     { 
      _color = value; 
     } 
    } 
} 

我的第一个想法是我序列化一个十六进制字符串,然后我可以转换回一个刷机。如果我可以将笔刷转换为十六进制,这也可以工作,这样我就可以在序列化之前更新字符串,并在反序列化字符串之后检索颜色。一个人可以转换刷获得一个十六进制字符串吗?或者有更好的序列化这个类的方法吗?

+0

看到这个http://stackoverflow.com/questions/4488476/how-can-i- serialize-xaml-brush – eYe 2015-04-06 13:31:07

+0

看到了这个解决方案,但它没有提到如何与其他属性一起工作?我仍在研究它。谢谢。 – AzzamAziz 2015-04-06 13:32:25

+1

使用BrushConverter类,以便可以将其序列化为字符串。 – 2015-04-06 13:56:38

回答

2

要序列化一个不可序列化的属性,最好使用可序列化的助手属性并在两者之间进行转换。您必须编写代码将两个属性同步到一起,以便在序列化时更新它们。这可以通过setter完成。请记住将NonSerialized属性添加到Brush和任何不可序列化的属性。

using System; 
using System.Runtime.Serialization; 
using WindowsMedia = System.Windows.Media; 

namespace Something.Something.DarkSide 
{ 
    [NonSerialized] 
    private readonly WindowsMedia.BrushConverter _colorConverter = new WindowsMedia.BrushConverter(); 

    [Serializable] 
    [DataContract] 
    public class ClassName: SerializeableBase<ClassName> 
    { 
     [DataMember(Name = "ColorString")] 
     private string _colorString; 
     public string ColorString 
     { 
      get { return _colorString; } 
      set 
      { 
       _colorString = value; 
       _color = (WindowsMedia.Brush)_colorConverter.ConvertFrom(value); 
       OnPropertyChanged(); 
      } 
     } 

     // Color 
     [NonSerialized] 
     private WindowsMedia.Brush _color = WindowsMedia.Brushes.Yellow; 
     public WindowsMedia.Brush Color 
     { 
      get { return _color; } 
      set 
      { 
       _color = value; 
       _colorString = _colorConverter.ConvertToString(value); 
       OnPropertyChanged(); 
      } 
     } 

     // This triggered when deserializing. 
     // When deserializing we will have the _color property as null since 
     // nothing is setting it. 
     // This ensures we initialize the _color when deserializing from the ColorString property. 
     [OnDeserialized] 
     private void SetValuesOnDeserialized(StreamingContext context) 
     { 
      _colorConverter = new WindowsMedia.BrushConverter(); 
      _color = (WindowsMedia.Brush)_colorConverter.ConvertFrom(ColorString); 
     } 

     public Annotation(string colorHexValue = null) 
     { 
      var colorBrush = (WindowsMedia.Brush)_colorConverter.ConvertFrom(colorHexValue); 
      Color = colorBrush ?? WindowsMedia.Brushes.Yellow; 
     } 

     public Annotation(WindowsMedia.Brush colorBrush = null) 
     { 
      Color = colorBrush ?? WindowsMedia.Brushes.Yellow; 
     } 
    } 
} 

*注意:当装载序列化文件的颜色将是无效和构造将不会被调用。然后,您必须创建对象的新实例并使用加载的属性重新构造它,以便从ColorString设置Color。您也可以在该类中创建一个帮助器方法,并在该属性上调用该方法来触发此更改,但请记住它确实在序列化加载时发生了NOT

var className = ClassName.LoadFromXmlFile(filePath); 
// We use the ColorString property because that's what we get after loading 
// the serialized file. The Color will be null at this point. 
className = new ClassName(className.ColorString); 

我有一个小问题试图加载回来,所以我用这个:

public static SerializableType LoadFromXmlFile(string filename) 
{ 
    using (var stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 1024)) 
    { 
     using (var reader = XmlDictionaryReader.Create(stream)) 
     { 
      var serializer = new DataContractSerializer(typeof(SerializableType)); 

      return (SerializableType)serializer.ReadObject(reader); 
     } 
    } 
}