user1793164
user1793164

Reputation: 85

Serialize into json and return as a stream

How can I serialize an object into json and return it as a stream?

I have tried:

        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;
        }

but the stream is always closed.

Next I have tried:

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

But this is not registering as a base64 string and I feel this method is less efficient.

Upvotes: 5

Views: 20874

Answers (2)

Eric Damtoft
Eric Damtoft

Reputation: 1425

Manushin's answer is correct about not closing the stream before returning it for your first snippet. Regarding your second snippet, base 64 encoding is different than text encoding. To quickly convert a string to a memory stream, you can use Encoding.GetBytes(string) to get a byte array:

var jsonString = JsonConvert.SerializeObject(new { test = "123" });
return new MemoryStream(Encoding.Default.GetBytes(jsonString));

Upvotes: 6

Manushin Igor
Manushin Igor

Reputation: 3689

Ask StreamWriter does not close your stream. And of course avoid stream disposing.

E.g. code will be:

    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;
    }

Another option - avoid stream closing, because you don't need it (native resources will not be leaked here):

    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;

Upvotes: 16

Related Questions