Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Newtonsoft.Json将Json直接序列化到AWS S3存储桶中_C#_Json_Amazon S3_Json.net - Fatal编程技术网

C# 使用Newtonsoft.Json将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读取的流类型。 我上传的数

我有一个对象,必须转换为Json格式,并通过流对象上传。这是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有什么方法可以实现这一点吗?

这里需要两件事:一是生产者/消费者流,例如来自的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