C# 使用Newtonsoft.Json将Json直接序列化到AWS S3存储桶中
我有一个对象,必须转换为Json格式,并通过流对象上传。这是AWS S3上传代码:C# 使用Newtonsoft.Json将Json直接序列化到AWS S3存储桶中,c#,json,amazon-s3,json.net,C#,Json,Amazon S3,Json.net,我有一个对象,必须转换为Json格式,并通过流对象上传。这是AWS S3上传代码: AWSS3Client.PutObjectAsync(new PutObjectRequest() { InputStream = stream, BucketName = name, Key = keyName }).Wait(); 此处流是由AWSS3Client读取的流类型。 我上传的数
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有什么方法可以实现这一点吗?这里需要两件事:一是生产者/消费者流,例如来自的BlockingStream,二是Json.Net序列化程序像这样写入此流。这里需要两件事:一是生产者/消费者流,例如来自的BlockingStream,第二,Json.Net序列化程序像这样写入此流。另一个实用选项是使用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
另一个实用的选择是用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
这种方法需要在单独的线程上阻塞流。我的问题看起来一点也不简单。我认为你最好的选择是使用临时文件。它有一个很大的优势——如果Json序列化由于任何原因中途失败,您就不会在AWS存储中留下半生不熟的未完成对象。在自定义生产者/消费者流之上实现适当的异常处理将使10行代码变成150行,而不会大大提高性能-临时文件只要是本地的,就不会那么慢。您应该在回答中添加此注释。基本上,我的魔术序列化流不存在,最好的方法是使用临时文件或序列化到内存流。我会说尝试最简单的方法-临时文件,看看性能并重新评估。我可以想象魔术序列化流是必要的情况。最近,我用TPL Dataflow实现了类似的功能,以节省大约100秒的时间,而代价是1000行代码——错误处理、背压、缓冲等等,但我迫切需要这样的功能——组织范围内强制执行SQL查询超时,不管怎样。我希望您的需求没有那么迫切:)这种方法需要在单独的线程上阻塞流。我的问题看起来一点也不简单。我认为你最好的选择是使用临时文件。它有一个很大的优势——如果Json序列化由于任何原因中途失败,您就不会在AWS存储中留下半生不熟的未完成对象。在自定义生产者/消费者流之上实现适当的异常处理将使10行代码变成150行,而不会大大提高性能-临时文件只要是本地的,就不会那么慢。您应该在回答中添加此注释。基本上,我的魔术序列化流不存在,最好的方法是使用临时文件或序列化到内存流。我会说尝试最简单的方法-临时文件,看看性能并重新评估。我可以想象魔术序列化流是必要的情况。最近,我用TPL Dataflow实现了类似的功能,以节省大约100秒的时间,而代价是1000行代码——错误处理、背压、缓冲等等,但我迫切需要这样的功能——组织范围内强制执行SQL查询超时,不管怎样。我希望你的需求没有那么迫切:)我希望这里有代码你有@crthompson我希望这里有代码你有@crthompson