gpt4 book ai didi

c# - JsonSerializer 无法写入 GZipStream

转载 作者:行者123 更新时间:2023-12-01 22:58:56 27 4
gpt4 key购买 nike

我正在尝试将非常大的对象直接序列化为 zip 流。我设法通过在中间步骤中序列化到文件流、将其加载回来然后压缩它来做到这一点。

我还尝试过直接压缩到内存流并且它有效。但是当我使用 GZipStream 时,我总是留下一个“未完成”的对象,数据就在那里,它的格式正确,直到意外结束。 这并不是因为缺少刷新缓冲区,因为我已经尝试过刷新所有内容。

简化的示例代码:

internal static byte[] SerializeAndCompress(object objectToSerialize)
{
using(var memStream = new MemoryStream())
using (var zipStream = new GZipStream(memStream, CompressionMode.Compress, true))
using (var streamWriter = new StreamWriter(zipStream))
using (var jsonWriter = new JsonTextWriter(streamWriter))
{
var jsonSerializer = new JsonSerializer { ContractResolver = new CamelCasePropertyNamesContractResolver(), Formatting = Newtonsoft.Json.Formatting.None };

jsonSerializer.Serialize(jsonWriter, objectToSerialize);
jsonWriter.Flush();

return memStream.ToArray();
}
}

谢谢。

最佳答案

我建议您完全关闭它,而不是刷新作者。这样,GZipStream 就知道没有更多数据需要写入,并且可以添加任何适当的校验和或任何需要执行的操作。

您可以显式调用 Close,或者将其放在 using 语句的结束部分之间:

using(var memStream = new MemoryStream())
{
using (var zipStream = new GZipStream(memStream, CompressionMode.Compress, true))
using (var streamWriter = new StreamWriter(zipStream))
using (var jsonWriter = new JsonTextWriter(streamWriter))
{
var jsonSerializer = new JsonSerializer { ContractResolver = new CamelCasePropertyNamesContractResolver(), Formatting = Newtonsoft.Json.Formatting.None };

jsonSerializer.Serialize(jsonWriter, objectToSerialize);
}
return memStream.ToArray();
}

请注意,当您调用 ToArray 时,MemoryStream 将已经关闭,但这没关系 - 数据仍然存在。

关于c# - JsonSerializer 无法写入 GZipStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32871013/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com