首页 > 解决方案 > 序列化成json并作为流返回

问题描述

如何将对象序列化为 json 并将其作为流返回?

我试过了:

        using (var stream = new MemoryStream())
        using (var streamWriter = new StreamWriter(stream))
        using (var jsonWriter = new JsonTextWriter(streamWriter))
        {
            var serializer = new JsonSerializer();
            serializer.Serialize(jsonWriter, obj);
            streamWriter.Flush();
            stream.Seek(0, SeekOrigin.Begin);
            return stream;
        }

但流总是关闭的。

接下来我尝试过:

new MemoryStream(Convert.FromBase64String(JsonConvert.SerializeObject(obj)))

但这不是注册为 base64 字符串,我觉得这种方法效率较低。

标签: c#streamjson.net

解决方案


Ask StreamWriter 不会关闭您的流。当然还要避免流式处理。

例如代码将是:

    var stream = new MemoryStream();
    using (var streamWriter = new StreamWriter(stream:stream, encoding:Encoding.UTF8, bufferSize:4096, leaveOpen:true)) // last parameter is important
    using (var jsonWriter = new JsonTextWriter(streamWriter))
    {
        var serializer = new JsonSerializer();
        serializer.Serialize(jsonWriter, obj);
        streamWriter.Flush();
        stream.Seek(0, SeekOrigin.Begin);
        return stream;
    }

另一种选择 - 避免关闭流,因为您不需要它(本机资源不会在这里泄漏):

    var stream = new MemoryStream();
    var streamWriter = new StreamWriter(stream)
    var jsonWriter = new JsonTextWriter(streamWriter)

    var serializer = new JsonSerializer();
    serializer.Serialize(jsonWriter, obj);
    jsonWriter.Flush();
    streamWriter.Flush();
    stream.Seek(0, SeekOrigin.Begin);
    return stream;

推荐阅读