如何将对象序列化为 json 并将其作为流返回?
我试过了:
using (var stream = new MemoryStream())
using (var streamWriter = new StreamWriter(stream))
using (var jsonWriter = new JsonTextWriter(streamWriter))
{
var serializer = new JsonSerializer();
serializer.Serialize(jsonWriter, obj);
streamWriter.Flush();
stream.Seek(0, SeekOrigin.Begin);
return stream;
}
Run Code Online (Sandbox Code Playgroud)
但流总是关闭的。
接下来我尝试过:
new MemoryStream(Convert.FromBase64String(JsonConvert.SerializeObject(obj)))
Run Code Online (Sandbox Code Playgroud)
但这不是注册为 base64 字符串,我觉得这种方法效率较低。
我有一个rusoto_core::ByteStream
实现期货的Stream
特征:
let chunks = vec![b"1234".to_vec(), b"5678".to_vec()];
let stream = ByteStream::new(stream::iter_ok(chunks));
Run Code Online (Sandbox Code Playgroud)
我想将它传递给actix_web 的HttpResponseBuilder::streaming
方法。
use actix_web::dev::HttpResponseBuilder; // 0.7.18
use rusoto_core::ByteStream; // 0.36.0
fn example(stream: ByteStream, builder: HttpResponseBuilder) {
builder.streaming(stream);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时,我收到以下错误:
let chunks = vec![b"1234".to_vec(), b"5678".to_vec()];
let stream = ByteStream::new(stream::iter_ok(chunks));
Run Code Online (Sandbox Code Playgroud)
我相信原因是streaming()
期望 a S: Stream<Item = Bytes, Error>
(ie, Item = Bytes
) 但我ByteStream
有Item = Vec<u8>
. 我该如何解决?
我认为解决方案是flatmap
我的,ByteStream
但我找不到这样的流方法。
这是一个如何streaming()
使用的示例:
let text = …
Run Code Online (Sandbox Code Playgroud) 我想向 golang 服务器提交一个带有大文件有效负载(最多几个 gbs)的 get 请求,而不是让它将多部分主体存储在文件系统上,然后将文件内容复制到缓冲区并转发它上,我想在请求的正文到达时将其转发到另一个服务(不存储任何内容)。这是一个修改后的(来自How can I receive an Uploaded file using a Golang net/http server?)非工作示例,用于发布请求:
func ReceiveFile(w http.ResponseWriter, r *http.Request) {
var Buf bytes.Buffer
file, header, err := r.FormFile("file")
if err != nil {
panic(err)
}
defer file.Close()
io.Copy(&Buf, file)
// stream Buf to grpc server
Buf.Reset()
return
}
Run Code Online (Sandbox Code Playgroud) 我有以下嵌套的 for 循环,我想转换为使用流,因为我目前正在学习使用流,我该怎么做?
我在下面添加了我当前的尝试,但目前尚不完整。
Part part = getPart();
List<Machines> machines = new ArrayList<>();
List<String> identities = getMachineIdentities();
Set<MachinePart> machineParts = new HashSet<>();
//create machines
for (String identity : identities) {
Machine machine = getMachine(identity);
machines.add(machine);
}
//map to MachineParts
for (Machine machines : machines) {
MachinePart machinePart = MachinePartCreator.new(machines, part);
machineParts.add(machinePart);
}
Run Code Online (Sandbox Code Playgroud)
流尝试:
Set<MachinePart > machineParts = identities.stream()
.map(identity-> ??? ).collectors.collect(Collectors.toSet()));
Run Code Online (Sandbox Code Playgroud) 我在 Scala 上使用 Akka Streams。
从 2.6.0 开始,不推荐使用 IOResult.status(状态始终设置为成功(完成)。从 2.6.0 开始。)。
请参阅https://doc.akka.io/japi/akka/current/akka/stream/IOResult.html#status()
如何检查错误?
顺便说一句,在我的测试中存在真正的错误,例如无效的文件名,状态具有失败(异常)值。
我在 C++ 中遇到了“没有运算符“<<”匹配这些操作数”错误(在 fout << dog 处)的问题。这是我的代码的样子:
int FileRepository::addDog(const Dog& dog)
{
if (this->findDog(dog.getName()) != -1)
return -1;
std::ofstream fout;
fout.open(this->fileName.c_str(), std::ios_base::app);
fout << dog;
fout.close();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
ostream& operator<<(ostream& outputStream, Dog& dog)
{
outputStream << dog.name << ", " << dog.breed << ", " << dog.birthDate << ", " << dog.numberOfShots << ", " << dog.photo << ", " << '\n';
return outputStream;
}
Run Code Online (Sandbox Code Playgroud)
我还导入了特定的头文件和库,并且“>>”运算符有效。
在这里它有效:
void FileRepository::writeVectorToFile(std::vector<Dog> vectorOfDogs)
{
ofstream fout(this->fileName.c_str());
for (Dog dog : vectorOfDogs)
fout …
Run Code Online (Sandbox Code Playgroud) 我需要检查给定的流是否是终端流。例如,使用*standard-output*
I do (equal (synonym-stream-symbol *standard-output*) *terminal-io*)
,但它返回 nil。
这很奇怪,因为(synonym-stream-symbol *standard-output*)
返回*terminal-io*
.
有任何想法吗?感谢您的任何建议。
在我的服务中,我们需要获取另一个服务创建的 zip 文件并将其返回。
这是我的代码(代码已针对问题进行了简化):
[HttpGet("mediafiles/{id}")]
public async Task<IActionResult> DownloadMediaFiles(int id)
{
var fileIds = _myProvider.GetFileIdsForEntityId(id); // result be like "1,2,3,4"
using var httpClient = new HttpClient();
var response = await httpClient.GetAsync($"http://file-service/bulk/{fileIds}");
var stream = await response.Content.ReadAsStreamAsync();
return File(stream, "application/octet-stream", "media_files.zip");
}
Run Code Online (Sandbox Code Playgroud)
使用id
我可以收集创建fileIds
字符串所需的信息并调用其他服务。
这是其他服务上的api(已针对问题简化了代码):
[HttpGet("bulk/{idList}")]
public async Task<IActionResult> DownloadBulk(string idList)
{
var ids = string.IsNullOrEmpty(idList) ? new List<int>() : idList.Split(',').Select(x => Convert.ToInt32(x));
using var memoryStream = new MemoryStream();
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{ …
Run Code Online (Sandbox Code Playgroud) 我想Collectors.summarizingInt
用整数调用一个集合。到目前为止我看到的例子是在一个带有(比如)Employees 的 Set 上,然后被称为collect(Collecters.summorizingInt(Employee::getWage))
. 对于裸整数 summorizingInt 需要一个参数,所以我可以这样做,collect(Collectors.summarizingInt((i) -> i))
但提供一个自映射器感觉有点奇怪。
有替代品吗?
我有一个整数列表, [1,2,3,4,5]
我想在应用乘法函数 (*5) 后将其转换为映射,如下所示:
{1 = 5, 2 = 10, 3 = 15, 4 = 20, 5 = 25}
Run Code Online (Sandbox Code Playgroud)
我能够使用流并使用 map 函数来执行乘法,但我对如何将结果转换为 map 感到困惑。
myList.stream().map(n -> n * 5).collect( ... )
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗。
stream ×10
java ×3
c# ×2
akka ×1
api ×1
asp.net-core ×1
c++ ×1
collections ×1
collectors ×1
common-lisp ×1
file-io ×1
for-loop ×1
go ×1
http ×1
json.net ×1
lambda ×1
lisp ×1
rust ×1
rust-actix ×1
scala ×1
summarize ×1
zip ×1