Newtonsoft.Json 是目前最常用的序列化对象方式,但对于 WPF 的 DependencyObject 确有些麻烦,今天这里提供一个转换类源代码方便大家。
有了这个简单的转换类,就可以很简单的直接序列化/反序列化 DependencyObject 基类的各种对象了。
class DependencyObjectJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(DependencyObject).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var obj = objectType.GetConstructor(Type.EmptyTypes).Invoke(null);
while (reader.Read() && reader.TokenType == JsonToken.PropertyName)
{
var pn = (string)reader.Value;
var prop = objectType.GetProperty(pn);
if (prop == null || !prop.CanWrite || prop.DeclaringType == typeof(DependencyObject) || prop.DeclaringType == typeof(DispatcherObject))
{
reader.Skip();
continue;
}
reader.Read();
prop.SetValue(obj, serializer.Deserialize(reader, prop.PropertyType));
}
return obj;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null)
{
writer.WriteNull();
return;
}
writer.WriteStartObject();
foreach(var prop in value.GetType().GetProperties())
{
if (!prop.CanRead || prop.DeclaringType == typeof(DependencyObject) || prop.DeclaringType == typeof(DispatcherObject))
continue;
var val = prop.GetValue(value);
if(val != null)
{
writer.WritePropertyName(prop.Name);
serializer.Serialize(writer, val);
}
}
writer.WriteEndObject();
}
}