标签: protobuf-3

Protobuf3:使用正则表达式进行字符串验证

我一直在使用Protobuf3来定义PB消息:

syntax = "proto3";
package vioozer_protobuf;

message Update
{
  string sensor_id = 1;
  ...
}
Run Code Online (Sandbox Code Playgroud)

在我的系统中,传感器具有唯一的id格式(a-la SENSOR-1342r43),可以使用正则表达式轻松验证.

有没有办法将一个正则表达式验证器添加到protobuf字段,以便只有符合正则表达式的字符串才会被接受到该字段中?

regex string validation protocol-buffers protobuf-3

7
推荐指数
2
解决办法
3080
查看次数

协议缓冲区中的多态性3

目前的设计

我正在重构一些退出的API代码,该代码返回用户的事件提要.API是一个普通的RESTful API,当前的实现只是查询数据库并返回一个feed.

代码很长且很麻烦,所以我决定将feed生成移动到将从API服务器调用的微服务.

新设计

为了解耦,我认为数据可以作为Protobuf对象从API服务器来回移动到微服务.这样,我可以改变两端的编程语言,仍然享受protobuf的类型安全和纤薄的尺寸.

在此输入图像描述

问题

Feed包含多种类型(例如,喜欢,图片和语音消息).将来可以添加新类型.例如,它们共享一些属性时间戳和标题 - 但除此之外,它们可能完全不同.

在经典的OOP中,解决方案很简单 - FeedItem所有feed项继承的基类,以及Feed包含一系列FeedItem类的类.

如何在Protocol Buffers 3中表达多态性的概念,或者至少在列表中启用不同类型的消息?

我检查了什么

  • Oneof:"一个不可重复的".
  • Any:太宽泛了(就像Java的List<Object>.

polymorphism protocol-buffers microservices protobuf-3

7
推荐指数
1
解决办法
3516
查看次数

如何在protobuf 3中存储时间

我在golang中有这个结构

struct File {
  name string
  creatation_time time.Time
}
Run Code Online (Sandbox Code Playgroud)

如何在protobuf3中编写它?

protobuf-3

5
推荐指数
1
解决办法
1618
查看次数

protobuf3 中重复的 Int32Value(可为 null 的 int 数组)

我有以下 protobuf 消息协议:

message TestMsg
{
  int32 int = 1;
  google.protobuf.Int32Value nullable_int = 2;
  repeated google.protobuf.Int32Value nullable_int_array = 3; // Runtime fail
}
Run Code Online (Sandbox Code Playgroud)

protoc 可以很好地编译它,并且在 C# 中所有 Int32Value 都是 int?。但它在运行时失败,并出现空参数不允许异常。我可以理解repeated不允许空消息。但是Int32Value是 WellKnownType,因此编译器可以根据需要生成特殊的 NullValue 类型。

这是 protobuf 中的限制(不允许Int32Valuein repeated)还是 C# 代码生成和支持库中的限制/错误?

除了创建自己的消息和代码生成之外,在 protobuf 协议中执行可空 int 数组的选项还有哪些?

c# protocol-buffers protobuf-csharp-port protobuf-3

5
推荐指数
1
解决办法
3364
查看次数

Python Protobuf 中高效的消息字段设置

我正在我正在开发的 Python 项目中使用 Protobuf (v3.5.1)。我的情况可以简化为以下内容:

// Proto file

syntax = "proto3";

message Foo {
    Bar bar = 1;
}

message Bar {
    bytes lotta_bytes_here = 1;
}

# Python excerpt
def MakeFooUsingBar(bar):
    foo = Foo()
    foo.bar.CopyFrom(bar)
Run Code Online (Sandbox Code Playgroud)

我担心的内存性能.CopyFrom()(如果我是正确的,它是复制内容,而不是引用)。现在,在 C++ 中,我可以使用如下内容:

Foo foo;
Bar* bar = new Bar();
bar->set_lotta_bytes_here("abcd");
foo.set_allocated_bar(bar);
Run Code Online (Sandbox Code Playgroud)

从生成的源来看,它看起来不需要复制任何内容:

inline void Foo::set_allocated_bar(::Bar* bar) {
  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
  if (message_arena == NULL) {
    delete bar_;
  }
  if (bar) {
    ::google::protobuf::Arena* submessage_arena = NULL;
    if (message_arena != submessage_arena) { …
Run Code Online (Sandbox Code Playgroud)

python protocol-buffers python-3.x protobuf-3

3
推荐指数
1
解决办法
8819
查看次数

在 C#/.NET 中使用 protobuf3 发送通用数据类型的正确方法

我正在使用插件架构开发一个应用程序,我想在客户端和服务器之间发送对象而不知道被发送的对象的类型。

有没有办法发送通用数据类型?

根据 Microsoft 页面,该Any字段可以解决此问题,而不是使用字符串和自定义序列化/反序列化实现来发送这些对象。但是,我没有发现提供的c#示例可以理解。我试图通过这种方式解决问题:

ClassTest myClassTest = new ClassTest();
Any packToSend = Any.Pack(myClassTest);

return Task.FromResult(new UnknownTEST
{
   Pathm = hai
}); ;
Run Code Online (Sandbox Code Playgroud)

但是好像我需要IMessage在我的类中实现接口,我不知道如何做到这一点。

如果有人能提供一个基本的例子来帮助我理解如何做到这一点,那就太好了。

谢谢 !

c# grpc protobuf-3 .net-core-3.1

3
推荐指数
1
解决办法
1066
查看次数