我最近使用gRPC与proto3,我已经注意到,required并optional在新的语法已被删除.
有人会解释为什么在proto3中删除了必需/可选项?这样的约束似乎对于使定义具有鲁棒性是必要的.
语法proto2:
message SearchRequest {
required string query = 1;
optional int32 page_number = 2;
optional int32 result_per_page = 3;
}
Run Code Online (Sandbox Code Playgroud)
语法proto3:
syntax = "proto3";
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;
}
Run Code Online (Sandbox Code Playgroud) 我通常在C#中编写代码的所有部分,在编写序列化的协议时,我使用FastSerializer快速高效地序列化/反序列化类.它也非常容易使用,并且非常直接地进行"版本控制",即处理不同版本的序列化.我通常使用的东西,看起来像这样:
public override void DeserializeOwnedData(SerializationReader reader, object context)
{
base.DeserializeOwnedData(reader, context);
byte serializeVersion = reader.ReadByte(); // used to keep what version we are using
this.CustomerNumber = reader.ReadString();
this.HomeAddress = reader.ReadString();
this.ZipCode = reader.ReadString();
this.HomeCity = reader.ReadString();
if (serializeVersion > 0)
this.HomeAddressObj = reader.ReadUInt32();
if (serializeVersion > 1)
this.County = reader.ReadString();
if (serializeVersion > 2)
this.Muni = reader.ReadString();
if (serializeVersion > 3)
this._AvailableCustomers = reader.ReadList<uint>();
}
Run Code Online (Sandbox Code Playgroud)
和
public override void SerializeOwnedData(SerializationWriter writer, object context)
{
base.SerializeOwnedData(writer, context);
byte serializeVersion = 4; …Run Code Online (Sandbox Code Playgroud)