首页 > 解决方案 > protobuf-net 转换列表使用 .ToProto() 时到 List_T 类

问题描述

我需要获取一个实现 .proto 的 C# 类库,protobuf-net并将它们转换为 .proto 文件,这些文件需要使用转换protoc为 .py 文件。我知道该.ToProto()函数可以很好地执行此操作,但是在从 .proto 转换为 .py 文件时遇到了涉及集合和泛型的问题。例如,当尝试序列化 DateTimes 列表时,我收到以下错误X.proto:64:13. "List_TimeSpan" is not defined.因为这在序列化到 protobuf 文件时没有引起问题,所以我当时不知道这种情况。

我目前正在proto-buf.net 2.3.2用于这个项目;这是我的其他一些工作已经完成的版本,我知道这可以通过版本升级来解决。我只是不确定这是否是我迄今为止所做的挖掘的答案。如果我还缺少其他东西,我将非常感谢任何可以帮助我的方法。

标签: c#protocol-buffersprotobuf-netproto

解决方案


如果我们考虑:

[ProtoContract]
public class Foo {
    [ProtoMember(12)]
    public List<DateTime> Times { get; } = new List<DateTime>();
}

然后GetProto<T>()在 v2.3.2(问题中提到的版本)和 v2.4.4(当前默认版本)中生成:

syntax = "proto2";
import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types

message Foo {
   repeated .bcl.DateTime Times = 12;
}

所以从表面上看,应该已经好了。如果您正在做一些更奇特的事情(也许使用字典值中的列表?),我很乐意提供帮助,但我需要更多关于您在做什么的线索。发布一些 C# 来展示你所看到的东西将是一个很好的起点。


请注意,当 protobuf-net 第一次出现时,对于类似日期/时间的值没有约定的传输格式,因此 protobuf-net 做了一些事情,但事实证明它适合跨平台工作;以下是一项重大更改(它与数据兼容),但如果可能,我强烈推荐 Google 后来添加的众所周知的格式:

[ProtoContract]
public class Foo {
    [ProtoMember(12, DataFormat = DataFormat.WellKnown)]
    public List<DateTime> Times { get; } = new List<DateTime>();
}

生成:

syntax = "proto2";
import "google/protobuf/timestamp.proto";

message Foo {
   repeated .google.protobuf.Timestamp Times = 12;
}

推荐阅读