我正在使用XAML作为序列化机制(对于配置,它不是WPF控件),我想使用自定义ValueSerializer
。请忽略糟糕的实施,它只是MCVE。
这是我想要自定义序列化程序的类型:
[ValueSerializer(typeof(PositionSerializer))]
public sealed class Position
{
public double X { get; set; }
public double Y { get; set; }
}
这是自定义序列化程序:
public sealed class PositionSerializer : ValueSerializer
{
public override bool CanConvertFromString(string value, IValueSerializerContext context)
{
return true;
}
public override object ConvertFromString(string value, IValueSerializerContext context)
{
if (String.IsNullOrWhiteSpace(value))
return new Position();
string[] parts = value.Split(',', ' ');
return new Position
{
X = Parse(parts[0]),
Y = Parse(parts[1])
};
}
private static double Parse(string value)
=> Double.Parse(value, NumberStyles.Number, CultureInfo.InvariantCulture);
}
这是容器:
public sealed class Test
{
public Position Location { get; set; }
}
要反序列化对象,我使用此代码:
var test = (Test)System.Xaml.XamlServices.Load(@"c:\test.xaml");
而test.xaml
只是:
<Test xmlns="clr-namespace:test;assembly=test" Location="2,3"></Test>
运行此代码时,我得到:
System.Xaml.XamlObjectWriterException:设置属性'test.Test.Location'抛出异常。 ---&GT; System.ArgumentException:'System.String'类型的对象无法转换为'test.Position'类型。
同样的结果:
<Test xmlns="clr-namespace:test;assembly=test">
<Test.Location>2,3</Test.Location>
</Test>
即使直接在[ValueSerializer(typeof(PositionSerializer))]
属性上应用Test.Location
也不会改变任何内容。使用TypeConverter
按预期工作,但我不能这样做(我很想知道为什么这不起作用)。
使用XamlServices.Save()
进行序列化时,也会忽略它(显然会添加ConvertToString()
和CanConvertToString()
方法。)