c# - 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
用于这个项目;这是我的其他一些工作已经完成的版本,我知道这可以通过版本升级来解决。我只是不确定这是否是我迄今为止所做的挖掘的答案。如果我还缺少其他东西,我将非常感谢任何可以帮助我的方法。
解决方案
如果我们考虑:
[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;
}
推荐阅读
- redux - 当我们在循环中使用 Redux-Saga all effect 时如何处理错误?
- kotlin - 仅当调用观察者方法时才返回值
- uipath - UIPath 社区版上的计划作业有什么问题?
- docker - 当我`ddev start`时,我得到“获取https://registry-1.docker.io/v2/drud/ddev-ssh-agent/manifests/v1.6.0:未授权:用户名或密码不正确”
- c# - 如何使用实体框架将二维数组保存在数据库中
- r - 图标在 R Shiny 中显示为 html 标签
- excel - 从特定列数据读取的 VBA 代码
- google-cloud-dataflow - Cloud Dataflow 新鲜度和延迟的确切定义是什么?
- javascript - javascript控制台陷阱?setTimeout 在控制台中返回的那些值是什么?
- python - 简化许多 if 语句