use*_*164 0 c# stream json.net
如何将对象序列化为 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;
}
Run Code Online (Sandbox Code Playgroud)
但流总是关闭的。
接下来我尝试过:
new MemoryStream(Convert.FromBase64String(JsonConvert.SerializeObject(obj)))
Run Code Online (Sandbox Code Playgroud)
但这不是注册为 base64 字符串,我觉得这种方法效率较低。
Manushin 的答案是正确的,即在返回第一个片段之前不关闭流。关于您的第二个片段,base 64 编码与文本编码不同。要快速将字符串转换为内存流,可以使用Encoding.GetBytes(string)获取字节数组:
var jsonString = JsonConvert.SerializeObject(new { test = "123" });
return new MemoryStream(Encoding.Default.GetBytes(jsonString));
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
另一种选择 - 避免关闭流,因为你不需要它(本地资源不会在这里泄露):
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4445 次 |
| 最近记录: |