我一直在使用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字段,以便只有符合正则表达式的字符串才会被接受到该字段中?
我正在重构一些退出的API代码,该代码返回用户的事件提要.API是一个普通的RESTful API,当前的实现只是查询数据库并返回一个feed.
代码很长且很麻烦,所以我决定将feed生成移动到将从API服务器调用的微服务.
为了解耦,我认为数据可以作为Protobuf对象从API服务器来回移动到微服务.这样,我可以改变两端的编程语言,仍然享受protobuf的类型安全和纤薄的尺寸.
Feed包含多种类型(例如,喜欢,图片和语音消息).将来可以添加新类型.例如,它们共享一些属性时间戳和标题 - 但除此之外,它们可能完全不同.
在经典的OOP中,解决方案很简单 - FeedItem所有feed项继承的基类,以及Feed包含一系列FeedItem类的类.
如何在Protocol Buffers 3中表达多态性的概念,或者至少在列表中启用不同类型的消息?
Oneof:"一个不可重复的".Any:太宽泛了(就像Java的List<Object>.我在golang中有这个结构
struct File {
name string
creatation_time time.Time
}
Run Code Online (Sandbox Code Playgroud)
如何在protobuf3中编写它?
我有以下 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 数组的选项还有哪些?
我正在我正在开发的 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) 我正在使用插件架构开发一个应用程序,我想在客户端和服务器之间发送对象而不知道被发送的对象的类型。
有没有办法发送通用数据类型?
根据 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在我的类中实现接口,我不知道如何做到这一点。
如果有人能提供一个基本的例子来帮助我理解如何做到这一点,那就太好了。
谢谢 !
protobuf-3 ×6
c# ×2
grpc ×1
polymorphism ×1
python ×1
python-3.x ×1
regex ×1
string ×1
validation ×1