繁体   English   中英

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

[英]Serializing Json directly into AWS S3 bucket with Newtonsoft.Json

我有一个对象必须转换为 Json 格式并通过 Stream 对象上传。 这是 AWS S3 上传代码:

        AWSS3Client.PutObjectAsync(new PutObjectRequest()
        {
            InputStream = stream,
            BucketName = name,
            Key = keyName
        }).Wait();

这里的是由 AWSS3Client 读取的流类型。 我上传的数据是一个复杂的对象,必须是 Json 格式。

我可以使用 JsonConvert.SerializeObject 将对象转换为字符串,或者使用 JsonSerializer 将对象序列化为文件,但由于数据量非常大,我宁愿避免使用临时字符串或文件,并立即将对象转换为可读流。 我的理想代码如下所示:

        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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM