上一篇文章最后提到基于System.Text.Json能够序列化SKColor对象,但是反序列化时却无法解析本地json数据。换成Newtonsoft.Json进行序列化和反序列化也是类似的问题。
通过百度及查看微软的帮助文档,上述情况下需自定义转换类以处理SKColor类型数据的序列化及反序列化。
自定义转换类需继承System.Text.Json.Serialization下的抽象类JsonConverter,最重要的是实现其中的Write和Read函数,前者用于序列化时输出指定字符串内容,后者用于反序列化时从字符串中解析数据。
针对本文而言,定义SKColorConverter转换SKColor类型数据,具体如下代码所示:
public class SKColorConverter : JsonConverter<SKColor>
{
public override SKColor Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return SKColor.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, SKColor value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
}
创建JsonSerializerOptions对象,并向其内的Converters函数添加SKColorConverter对象实例,然后在序列化及反序列化函数中使用,主要代码如下所示:
JsonSerializerOptions options = new JsonSerializerOptions();
options.Converters.Add(new SKColorConverter());
using (FileStream fs = new FileStream(saveFileDialog.FileName, FileMode.CreateNew, FileAccess.Write))
{
JsonSerializer.Serialize<SealInfo>(fs, m_currSeal, options);
}
using (FileStream fs = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read))
{
using(StreamReader sr = new StreamReader(fs))
{
m_currSeal = JsonSerializer.Deserialize<SealInfo>(sr.ReadToEnd(), options);
}
}
最后是序列化效果,如下所示,也能够正常的反序列化了。
参考文献:
[1]https://blog.csdn.net/m0_75039529/article/details/135483569
[2]https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json/converters-how-to?pivots=dotnet-8-0
[3]https://blog.csdn.net/hefeng_aspnet/article/details/135058154