C#基于SkiaSharp实现印章管理(2)

发布于:2024-06-27 ⋅ 阅读:(138) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到