使用 Newtonsoft.JSON 将 Json 直接序列化到 AWS S3 存储桶中



我有一个对象必须转换为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

相关内容

  • 没有找到相关文章

最新更新