如何使用protobuf存储数据集

时间:2018-11-02 08:51:24

标签: serialization protocol-buffers protobuf-net data-stream

我需要紧凑地存储灵活的数据集并具有流式传输的能力。 数据集包含表格数据,每行包含相同的类型。

更好的是:  -用重复的原型消息写一个大的原型消息?  -多个原始消息会直接写入steram(以及一些附加信息,有关内部的原始格式)?  -还是存在更好的方法?

protobuf是否支持流传输?

1 个答案:

答案 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) {}
}