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
相关产品推荐
相关产品推荐

