Newtonsoft.Json迁移System.Text.Json:流序列化代码转换求助
Newtonsoft.Json 转 System.Text.Json:序列化对象到流的实现
原代码基于Newtonsoft.Json实现对象到流的JSON序列化,核心逻辑包括:使用无BOM的UTF8编码、指定1024字节缓冲区、保留流不关闭、忽略循环引用、无格式输出。以下是对应的System.Text.Json实现:
public static void SerializeJsonIntoStream(object value, Stream stream) { var options = new JsonSerializerOptions { ReferenceHandler = ReferenceHandler.IgnoreCycles, WriteIndented = false // 对应原代码的Formatting.None,默认即为false,可省略 }; // 手动创建Utf8JsonWriter,匹配原代码的缓冲区大小与流保留逻辑 using var writer = new Utf8JsonWriter(stream, new JsonWriterOptions { Indented = false, // 缓冲区大小默认1024,与原代码一致,可省略显式指定 }); JsonSerializer.Serialize(writer, value, options); writer.Flush(); }
如果不需要手动控制Writer细节,也可以用更简洁的重载:
public static void SerializeJsonIntoStream(object value, Stream stream) { var options = new JsonSerializerOptions { ReferenceHandler = ReferenceHandler.IgnoreCycles, WriteIndented = false }; JsonSerializer.Serialize(stream, value, options); }
关键逻辑对应说明:
- 无BOM UTF8编码:System.Text.Json默认使用无BOM的UTF8编码,和原代码
new UTF8Encoding(false)行为完全一致。 - 保留流不关闭:原代码通过
StreamWriter的leaveOpen=true避免关闭流;System.Text.Json的序列化方法默认不会关闭传入的流,符合需求。 - 忽略循环引用:原代码
ReferenceLoopHandling.Ignore对应System.Text.Json的ReferenceHandler.IgnoreCycles。 - 无格式输出:原代码
Formatting.None对应JsonWriterOptions.Indented=false或JsonSerializerOptions.WriteIndented=false,默认即为false,可省略。 - 缓冲区大小:
Utf8JsonWriter默认缓冲区大小为1024字节,和原代码的设置匹配,无需额外指定。
内容的提问来源于stack exchange,提问作者datnet
相关产品推荐
相关产品推荐

