Использование ISerializable разрывает сериализацию для ранее поддерживаемых типов - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь сериализовать / десериализовать свой класс, который имеет свойство 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 идругие свойства, которые работали прежде, чтобы продолжать работать ... Есть ли способ, которым я могу избежать явной обработки их сериализации?

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

Как уже упоминалось, вам нужно сериализовать все, если вы явно попросите об этом, используя ISerializable.

Чтобы исправить это, вы получили 2 очень простых решения:

Раствор 1 Обеспечьте сериализацию для всех типов, которые вы хотите сериализовать

Решение 2 Удалите ISerializable и добавьте IgnoreDataMemberAttribute к вашему Color свойству. Также добавьте некоторое свойство только для сериализации, например:

public string ColorSerialized
{
    get => new ColorConverter().ConvertToString(_RgbColor);
    set => _RgbColor = (Color)ColorConverter.ConvertFromString(value);
}
1 голос
/ 06 мая 2019

Согласно документам :

Когда GetObjectData вызывается во время сериализации, вы несете ответственность для заполнения SerializationInfo, предоставляемого вызовом метода.

Другими словами, вы несете ответственность за сериализацию (и десериализацию) всех интересующих вас данных (не только Color).

...