c# - 序列化成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 字符串,我觉得这种方法效率较低。
解决方案
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;
推荐阅读
- flutter - Flutter- 从 Firestore 获取数据并在 FormBuilderDropdown 中使用它
- javascript - 通过给定的索引,角度将选定的对象从数组中移动到数组中的位置
- typescript - Formik 中的“onSubmit”函数有什么问题?
- java - 如何在java中打印带两位小数和不带小数的浮点值
- amazon-web-services - 使用 cloudwatch 代理自动扩展内存利用率
- reactjs - 如何使自定义文本出现在chartjs条形图中每个条形下方?
- c++ - 仅在 zlib c++ 库中强制动态编码
- python - 使用python从谷歌下载随机图像
- java - Java - ProcessBuilder 不将 -XX:MaxDirectMemorySize 传递给 JVM
- javascript - 无法为在 JavaScript 中创建的 div 按钮设置值