System.Text.Json UTF-8反序列化困惑:为何需Base64转码还原对象?
问题分析与解决方案
冗余流程是否必要?
完全没必要。你的问题根源出在序列化阶段的错误操作:你先调用JsonSerializer.SerializeToUtf8Bytes()得到了目标对象的UTF-8字节数组,接着又把这个字节数组传入JsonSerializer.SerializeAsync()再次序列化——这会让.NET的JsonSerializer把byte[]类型序列化为Base64编码的字符串,而不是直接写入原始的UTF-8字节。这就是为什么你读取时必须走Base64解码的冗余流程,本质是为了弥补序列化时的多此一举。
更优的UTF-8字节数组序列化/反序列化方案
正确的序列化逻辑
直接把SerializeToUtf8Bytes()得到的字节数组写入文件即可,不需要再次通过JsonSerializer处理:
// getFunc() 是返回T类型对象的委托 byte[] bytes = JsonSerializer.SerializeToUtf8Bytes(getFunc()); await File.WriteAllBytesAsync(filePath, bytes);
或者用流式写法更高效(适合大对象):
using FileStream stream = File.Create(filePath); await JsonSerializer.SerializeAsync(stream, getFunc()); // using语句会自动释放资源,无需手动调用DisposeAsync()
正确的反序列化逻辑
直接读取文件字节数组,反序列化为目标类型<T>:
byte[] fileBytes = await File.ReadAllBytesAsync(filePath); var content = JsonSerializer.Deserialize<T>(fileBytes);
或者流式读取:
using FileStream stream = File.OpenRead(filePath); var content = await JsonSerializer.DeserializeAsync<T>(stream);
为什么原代码会生成Base64?
当你把byte[]类型传给JsonSerializer.SerializeAsync()时,JsonSerializer会遵循JSON规范——JSON本身不支持原始字节类型,所以默认会将byte[]编码为Base64字符串。这就是你看到文件内容是Base64的原因,完全是多余的二次序列化导致的。
内容的提问来源于stack exchange,提问作者user3267755
相关产品推荐
相关产品推荐

