上一篇文章最后提到基于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