使用 ISerializable 中断以前支持的类型的序列化

Using ISerializable breaks serialization for previously supported types

我正在尝试 serialize/deserialize 自定义 class 我有一个 System.Windows.Media.Color 属性。它不起作用,因为 Color 没有 [Serializable] 属性。基于其他一些文章,我决定实现 ISerializable,这将允许我为 Color 类型定义自定义序列化逻辑。

颜色现在可以正确序列化,但现在我的其他属性(字节、浮点数、字符串)没有被序列化。当我实现 ISerializable 时,我是否真的需要为每个 属性 定义明确的序列化逻辑,即使它们一开始就已受支持?

        #region Serialization
        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            string colorString = new ColorConverter().ConvertToString(_RgbColor);
            info.AddValue("System.Windows.Media.Color", colorString, typeof(string));
        }
        public AbstractColorModifier(SerializationInfo info, StreamingContext context)
        {
            string colorString = (string)info.GetValue("System.Windows.Media.Color", typeof(string));
            _RgbColor = (Color)ColorConverter.ConvertFromString(colorString);
        }

        #endregion Serialization

        #region Properties
        private Color _RgbColor = Colors.Black;
        public Color RgbColor {
            get { return _RgbColor; }
            set
            {
                if (_RgbColor != value) {
                    _RgbColor = value;
                    NotifyPropertyChanged("RgbColor");
                }
            }
        }

        private byte _ByteColor = 0;
        public byte ByteColor {
            get { return _ByteColor; }
            set { ... }
        }
        private float _FloatColor = 0;
        public float FloatColor {
            get { return _FloatColor; }
            set { ... }
        }
        #endregion Properties

我原以为 byte float 和其他之前有效的属性会继续有效。有什么方法可以避免显式处理它们的序列化吗?

根据the docs

When GetObjectData is called during serialization, you are responsible for populating the SerializationInfo provided with the method call.

换句话说,您负责序列化(和反序列化)您感兴趣的所有数据(不仅仅是Color)。

如前所述,如果您使用 ISerializable.

明确要求,则需要序列化所有内容

要解决这个问题,您现在有 2 个非常简单的解决方案:

解决方案 1 为您想要序列化的 所有 类型提供序列化

解决方案 2 删除 ISerializable 并在 Color 属性 中添加 IgnoreDataMemberAttribute。还要像这样添加一些仅序列化 属性:

public string ColorSerialized
{
    get => new ColorConverter().ConvertToString(_RgbColor);
    set => _RgbColor = (Color)ColorConverter.ConvertFromString(value);
}