You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:06:21