首页 > 解决方案 > 没有序列化的 Protobuf

问题描述

顾名思义,我想知道使用 Protobuf 是否有意义,而无需目前必须以任何形式序列化数据(将来可能会改变)。我的意思是将它们纯粹用作数据结构,将信息从一个函数传递到另一个函数,所有函数都在同一个地址空间中执行。或者你觉得这可能是一种矫枉过正并看到其他选择。

背景:我必须设计一个实现某些接口的库。目前,我的同事已经使用几个带参数的函数来实现它.. 示例:

void readA(int iIP1, int iIP2, Result& oOP)
void readB(std::string iIP1, Result& oOP)
void readC(std::vector<int> iIP1, Result& oOP)

我想改变这一点,只提供一个接口函数:

void ReadFn(ReadMsg& ip, ReadResult& res);

并且数据结构在 Protobuf 中定义如下..

message ReadMsg {
enum ReadWhat {
 A = 0;
 B = 1;
 C = 2;
}
message readA {
  int32 iIP1 = 1;
  int32 iIP2 = 2;
}
message readB {
  string IP1 = 1;
}
message readC {
  repeated int IP1 = 1;
}

oneof actRead {
  readA rA = 1;
  readB rB = 2;
  readC rC = 3;
}
}

与传统的界面设计(使用功能)相比,它提供了许多优势,而我的努力却很少。如果这些组件作为服务部署在不同的进程/机器中(当然还有额外的实现),这将是未来的证明。但是鉴于 Protocol Buffers 的优势在于它们的序列化功能,我目前没有使用,你会选择在这些琐碎的任务中使用它们吗?

谢谢

标签: interfaceprotocol-buffers

解决方案


struct如果有很多函数参数,则将它们分组为 a 是有意义的。readA如果,readBreadC函数共享许多公共部分,那么将它们组合成一个函数是有意义的。

.proto但是,如果您不打算将其用于序列化,则在我看来没有意义的是引入单独的文件和 protobuf 依赖项。大多数语言中已经存在将数据分组为可重用结构的类似功能。并且当您使用该语言的内置功能时,所有代码都保留在同一个位置,并且更易于理解。


推荐阅读