在 dotnet 6 内置了通过源代码生成的方式进行序列化 JSON 对象,性能非常高。使用的时候需要将 Json 序列化工具类换成 dotnet 运行时自带的 System.Text.Json 进行序列化,再加上一个继承 JsonSerializerContext 的辅助类型,且在此类型标记 JsonSerializableAttribute 特性,将此类型传入序列化和反序列化即可完成对接。然而在使用的过程中,如果发现此辅助类型的实际代码没有生成,且输出提示 SYSLIB1032 警告,那可能就是此辅助类型没有写对导致
如官方文档的对 SYSLIB1032 的描述,这是由于标记了 JsonSerializableAttribute 的类型没有写上 partial 关键词,导致了源代码生成无法通过分部类生成代码,从而失败
也因为源代码生成由于没有 partial 关键词,生成代码失败,从而导致了辅助类型没有实现 JsonSerializerContext 的方法,从而给出以下错误
- error CS0534: 不实现继承的抽象成员“JsonSerializerContext.GeneratedSerializerOptions.get”
- error CS0534: 不实现继承的抽象成员“JsonSerializerContext.GetTypeInfo(Type)”
- error CS7036: 未提供与“JsonSerializerContext.JsonSerializerContext(JsonSerializerOptions?)”的必需形参“options”对应的实参
大家可别被以上的错误给迷惑了哦,这三个错误都是由于 SYSLIB1032 警告的描述,源代码没有生成,从而让辅助类型没有实现 JsonSerializerContext 的方法
解决方法也如官方文档所述,给辅助类型加上 partial 关键词即可
额外的,如果给辅助类型加上 partial 关键词之后,依然提示 SYSLIB1032 错误,还需要检查一下,是否此辅助方法放在其他类型里面。是其他类型的内部类。如果是内部类,那就需要将外部的类,一条龙全部加上 partial 关键词才可以。否则源代码生成将无法创建代码
例如以下代码,在 Program 类型里面,包含了 MyJsonContext 这个辅助类型,即使在 MyJsonContext 类型上面加上 partial 关键词,然而由于 Program 类型没有加上 partial 关键词,源代码依然失败
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
namespace GemjabemrawWohearcebola;
internal class Program
{
[JsonSerializableAttribute(typeof(WeatherForecast))]
internal partial class MyJsonContext : JsonSerializerContext
{
}
}
修复方法就是给外部的类,一条龙全部加上 partial 关键词,如以下代码
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
namespace GemjabemrawWohearcebola;
internal partial class Program
{
[JsonSerializableAttribute(typeof(WeatherForecast))]
internal partial class MyJsonContext : JsonSerializerContext
{
}
}
本文会经常更新,请阅读原文: https://blog.lindexi.com/post/dotnet-6-%E4%BF%AE%E5%A4%8D%E5%9C%A8-System.Text.Json-%E4%BD%BF%E7%94%A8-source-generation-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E6%8F%90%E7%A4%BA-SYSLIB1032-%E9%94%99%E8%AF%AF.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者收藏我的博客导航
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。
无盈利,不卖课,做纯粹的技术博客
以下是广告时间
推荐关注 Edi.Wang 的公众号
欢迎进入 Eleven 老师组建的 .NET 社区
以上广告全是友情推广,无盈利