我需要紧凑地存储灵活的数据集并具有流式传输的能力。 数据集包含表格数据,每行包含相同的类型。
更好的是: -用重复的原型消息写一个大的原型消息? -多个原始消息会直接写入steram(以及一些附加信息,有关内部的原始格式)? -还是存在更好的方法?
protobuf是否支持流传输?
答案 0 :(得分:1)
您可能已经注意到,protobuf主要是用于将数据序列化/反序列化为二进制形式或从二进制形式反序列化的框架。如果您要传输数据,当然可以以流方式发送-毕竟只是字节。
您可以编写自己的网络协议,但是可能正在寻找类似gRPC的东西(链接是C#教程-从您的标签推导出)。 gRPC允许流式传输-您可以here了解更多信息。快速报价:
服务器流RPC服务器流RPC与我们简单的 例如,除了服务器在之后发送回响应流 获取客户的请求消息。寄回所有 响应,服务器的状态详细信息(状态代码和可选 状态消息)和可选的尾随元数据发送回 在服务器端完成。客户端完成所有 服务器的响应。
客户端流式RPC客户端流式RPC也类似于我们的 一个简单的示例,除了客户端将请求流发送到 服务器而不是单个请求。服务器发回单个 回应,通常但不一定是在收到所有回应后 客户的请求及其状态详细信息和可选的尾随 元数据。
此外,作为一个简单的示例,请访问this page。来自gRPC网站的示例:
public override async Task<RouteSummary> RecordRoute(Grpc.Core.IAsyncStreamReader<Point> requestStream,
Grpc.Core.ServerCallContext context)
{
int pointCount = 0;
int featureCount = 0;
int distance = 0;
Point previous = null;
var stopwatch = new Stopwatch();
stopwatch.Start();
while (await requestStream.MoveNext())
{
var point = requestStream.Current;
pointCount++;
if (CheckFeature(point).Exists())
{
featureCount++;
}
if (previous != null)
{
distance += (int) previous.GetDistance(point);
}
previous = point;
}
stopwatch.Stop();
return new RouteSummary
{
PointCount = pointCount,
FeatureCount = featureCount,
Distance = distance,
ElapsedTime = (int)(stopwatch.ElapsedMilliseconds / 1000)
};
}
编辑
其中包含gRPC定义的原始文件示例。
syntax = "proto3";
message DataRow {
// Your data row here
}
message SendDataResponse {
}
service DataAcceptor {
// Send multiple rows in a streaming scenario
rpc SendData (stream DataRow) returns (SendDataResponse) {}
}