我有一个对象必须转换为Json格式并通过Stream对象上传。这是AWS S3上传代码:
AWSS3Client.PutObjectAsync(new PutObjectRequest()
{
InputStream = stream,
BucketName = name,
Key = keyName
}).Wait();
这里的流是Stream类型,由AWSS3Client读取。我上传的数据是一个复杂的对象,必须是Json格式。
我可以使用JsonConvert.SerializeObject将对象转换为字符串或使用JsonSerializer序列化为文件,但由于数据量非常大,我宁愿避免使用临时字符串或文件,并立即将对象转换为可读的Stream。我理想的代码看起来像这样:
AWSS3Client.PutObjectAsync(new PutObjectRequest()
{
InputStream = MagicJsonConverter.ToStream(myDataObject),
BucketName = name,
Key = keyName
}).Wait();
有没有办法使用Newtonsoft.Json实现这一目标?
这里你需要两件事:一件是生产者/消费者流,例如:来自this StackOverflow question的BlockingStream,以及第二个,Json.Net序列化器写入此流,就像在这个another SO question中一样。
另一个实用的选择是用gzip流包装内存流(2行代码)。 通常JSON文件会有很好的压缩(1GB文件可以压缩到50MB)。 然后在将流提供给S3时,用gzip steram将其解压缩,然后将其解压缩。 我想与临时文件比较的权衡是CPU与IO(两者都可能运行良好)。如果您可以将其压缩保存在S3上,它将节省您的空间并提高网络效率。