我在内存中有一个对象,我想在压缩数据时使用System.Text.Json.JsonSerializer
对其进行序列化(并保留流以供以后使用,特别是使用Stream InputStream
将其传递到S3 SDK以放入存储)。
await using var stream = new MemoryStream(); // <- compressed content stored here
await using var gzip = new GZipStream(stream, CompressionLevel.Optimal); // <- compression
await JsonSerializer.SerializeAsync(gzip, myObject); // <- serialize
gzip.Flush(); // <- make sure everything is flushed
此时,stream
包含JSON序列化myObject
的压缩二进制数据,最后,我希望将此数据存储到一个文件中-本地或存储到S3(使用Amazon.S3.Transfer.TransferUtility
,将stream
传递给InputStream
属性)。
- 如何将内容保存到文件(使用文件流会产生无效的
.gz
文件)? - 如何指定
.gz
包中内容所放置文件(名称)?
1条答案
按热度按时间omtl5h9j1#
您需要将
MemoryStream
的位置重新设置为0
,否则没有任何内容可供读取。或者,您可以使用流内部的底层数组,这可能会更有效。您仍然应该在将流发送到S3之前重置流位置。
注意在函数结束之前使用大括号来正确地刷新和关闭文件。你应该这样做而不是
Flush
。你不能。gzip 规范中没有添加文件名的机制,它是为压缩单个文件而设计的。通常你会先生成一个 tarball,或者使用
ZipArchive
,它使用类似的压缩算法。