我有一个对象必须转换为Json格式并通过Stream对象上传。这是 AWS S3 上传代码:
AWSS3Client.PutObjectAsync(new PutObjectRequest()
{
InputStream = stream,
BucketName = name,
Key = keyName
}).Wait();
这里的流是由AWSS3Client读取的流类型。我上传的数据是一个复杂的对象,必须采用 Json 格式。
我可以使用JsonConvert.SerializeObject将对象转换为字符串,也可以使用JsonSerializer序列化为文件,但由于数据量非常重要,我宁愿避免临时字符串或文件,并立即将对象转换为可读的Stream。我的理想代码看起来像这样:
AWSS3Client.PutObjectAsync(new PutObjectRequest()
{
InputStream = MagicJsonConverter.ToStream(myDataObject),
BucketName = name,
Key = keyName
}).Wait();
有没有办法使用Newtonsoft.Json来实现这一点?
这里需要两样东西:一是生产者/消费者流,例如来自这个 StackOverflow 问题的 BlockingStream,第二,Json.Net 序列化程序写入这个流,就像在另一个 SO 问题中一样。
另一个实用的选择是用 gzip 流(2 行代码)包装内存流.
通常,JSON 文件会有很好的压缩(1GB 文件可以压缩到 50MB).
然后,当将流提供给 S3 时,用 gzip 流包装它,解压缩它.
我想与临时文件相比的权衡是 CPU 与 IO(两者都可能工作得很好)。 如果可以将其压缩保存在 S3 上,它将节省您的空间并提高网络效率><。示例代码:
var compressed = new MemoryStream();
using (var zip = new GZipStream(compressed, CompressionLevel.Fastest, true))
{
-> Write to zip stream...
}
compressed.Seek(0, SeekOrigin.Begin);
-> Use stream to upload to S3