使用 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);
}
我正在尝试 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);
}