C# 在.proto文件中使用所需的字节

C# 在.proto文件中使用所需的字节,c#,.net,serialization,protocol-buffers,protobuf-net,C#,.net,Serialization,Protocol Buffers,Protobuf Net,当通过序列化/反序列化时,所需的字节应该如何工作,这让我摸不着头脑 给出这样一个原型: message MyMessage { // 0 or more bytes required bytes content = 1; } 与可选的字节字段相比,我期望有某种不同的行为。我所能说的是,没有办法区分线路上的空字节数组和零长度字节数组 作为旁注:我们正在使用它,它有时会为空/空重复字段添加一些额外的类似于非空的非空列表,但对于字节,在使用零/空字节数组的情况下,无论是必需的还是可选

当通过序列化/反序列化时,所需的字节应该如何工作,这让我摸不着头脑

给出这样一个原型:

message MyMessage
{
    // 0 or more bytes
    required bytes content = 1;
}
与可选的字节字段相比,我期望有某种不同的行为。我所能说的是,没有办法区分线路上的空字节数组和零长度字节数组

作为旁注:我们正在使用它,它有时会为空/空重复字段添加一些额外的类似于非空的非空列表,但对于字节,在使用零/空字节数组的情况下,无论是必需的还是可选的,我们都会得到空值


简而言之,required对字节字段有什么影响(如果有)?如果没有,总是使用可选字节是否更好?

我不知道Protobuf Net的具体情况,但在大多数Protobuf实现中,每个字段都有一个has访问器,它返回true或false以指示字段是否已显式设置。您可以显式地将字节字段设置为空。“必需”只是确保您不会忘记设置它


实际上,我强烈建议您不要使用required

嗯,这是否意味着某些东西会被序列化,比如字段集或类似的东西?否则,反序列化程序如何知道字段是在不考虑实现的情况下设置的?对于Protobufs,只有显式设置的字段才会在线路上发送。协议是一系列标记/值对,因此解析器可以判断哪些标记/值对不存在。普罗托船长在这次重铸中大不相同。