如何序列化 Windows.Media.Brush

Posted

技术标签:

【中文标题】如何序列化 Windows.Media.Brush【英文标题】:How to serialize a Windows.Media.Brush 【发布时间】:2015-06-10 21:49:45 【问题描述】:

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

我将 [Serializable] 属性放在类本身上,并将 [DataContract] 以及 [DataMember(Name = "PropertyName")] 放在每个属性上,所以它看起来像这样:

[Serializable]
[DataContract]
public class ClassName: SerializeableBase<ClassName>

    // Color
    [DataMember(Name = "Color")]
    private Brush _color;
    public Brush Color
    
        get  return _color; 
        set
        
            _color = value;
        
    

我的第一个想法是我序列化一个十六进制字符串,然后我可以将其转换回画笔。如果我也可以将 Brush 转换为十六进制,这样我就可以在序列化之前更新字符串以及在反序列化字符串之后检索颜色。可以转换 Brush 以从中获取十六进制字符串吗?或者有没有更好的方法来序列化这个类?

【问题讨论】:

看到这个***.com/questions/4488476/… 看过那个解决方案,但它没有提到它如何与其他属性一起工作?我还在研究它。谢谢。 使用 BrushConverter 类,以便您可以将其序列化为字符串。 @HansPassant 这就是我现在实际使用的。 :) 谢谢!遇到其他问题。完成后会更新答案。 【参考方案1】:

要序列化不可序列化的属性,最好使用可序列化的辅助属性并在两者之间进行转换。您必须编写代码将两个属性同步在一起,以便在序列化时更新它们。这可以通过设置器来完成。请记住将 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;
        
    

*注意:加载序列化文件时,Color 将为 null,并且不会调用构造函数。然后,您必须创建对象的新实例并使用加载的属性重新构建它,以便它将从 ColorString 设置颜色。您也可以在类中创建一个辅助方法并在属性上调用它以触发此更改,但请记住它不会发生在序列化加载时。

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

【讨论】:

以上是关于如何序列化 Windows.Media.Brush的主要内容,如果未能解决你的问题,请参考以下文章

如何进行序列比对?如何进行序列拼接

什么是序列化? 如何实现(反)序列化 序列化的应用

c# sorket序列化反序列化如何如何传接Object?

什么是序列化,在java中如何实现序列化?

如何序列化一个 lambda?

什么是序列化? 如何实现(反)序列化 序列化的应用