protobuf-net 在使用 .ToProto() 时将 List<T> 转换为 List_T class

protobuf-net converts List<T> to List_T class when using .ToProto()

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

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

如果我们考虑:

[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 刚出现时,没有约定 date/time-like 值的传输格式,所以 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;
}