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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:57:27