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

System.Text.Json序列化MemoryStream报错,该如何解决?

解决System.Text.Json序列化MemoryStream时的"此流不支持超时操作"异常

问题原因

System.Text.Json没有内置的Stream类型序列化规则,序列化过程中会尝试读取Stream的Timeout属性,但MemoryStream本身不支持超时机制,访问该属性直接触发InvalidOperationException。


解决方案1:自定义Json转换器

实现一个针对MemoryStream的Json转换器,将流内容转为Base64字符串序列化,反序列化时再从Base64转回MemoryStream。

代码示例:

using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;

// 自定义MemoryStream转换器
public class MemoryStreamConverter : JsonConverter<MemoryStream>
{
    public override MemoryStream Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var base64 = reader.GetString();
        var bytes = Convert.FromBase64String(base64);
        return new MemoryStream(bytes);
    }

    public override void Write(Utf8JsonWriter writer, MemoryStream value, JsonSerializerOptions options)
    {
        value.Position = 0; // 重置流位置到开头,确保读取完整内容
        var bytes = new byte[value.Length];
        value.Read(bytes, 0, bytes.Length);
        var base64 = Convert.ToBase64String(bytes);
        writer.WriteStringValue(base64);
    }
}

// 使用转换器进行序列化
using var memoryStream = new MemoryStream();
var sampleText = "Hello, MemoryStream!";
var byteArray = Encoding.UTF8.GetBytes(sampleText);
memoryStream.Write(byteArray, 0, byteArray.Length);

var testClass = new TestClass
{
    Stream = memoryStream
};

var options = new JsonSerializerOptions();
options.Converters.Add(new MemoryStreamConverter());
var json = JsonSerializer.Serialize(testClass, options);

public class TestClass
{
    public MemoryStream Stream { get; set; }
}

解决方案2:替换为byte[]属性存储

如果不需要保留MemoryStream对象本身,可直接将流内容转为byte[]存储,序列化字节数组(System.Text.Json内置支持byte[]序列化),需要时再转回MemoryStream。

代码示例:

using System.Text;
using System.Text.Json;

using var memoryStream = new MemoryStream();
var sampleText = "Hello, MemoryStream!";
var byteArray = Encoding.UTF8.GetBytes(sampleText);
memoryStream.Write(byteArray, 0, byteArray.Length);

// 将流内容转为byte[]
memoryStream.Position = 0;
var streamBytes = new byte[memoryStream.Length];
memoryStream.Read(streamBytes, 0, streamBytes.Length);

var testClass = new TestClass
{
    StreamBytes = streamBytes
};
var json = JsonSerializer.Serialize(testClass);

// 需要使用流时,从byte[]转回MemoryStream
var restoredStream = new MemoryStream(testClass.StreamBytes);

public class TestClass
{
    // 用byte[]替代MemoryStream属性
    public byte[] StreamBytes { get; set; }
}

内容的提问来源于stack exchange,提问作者user246392

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:31:04