如果遵循这些规则,旧代码将很乐意阅读新消息,而忽略任何新字段。对于旧代码,删除的单个字段将仅具有其默认值,而删除的重复字段将为空。新代码还将透明地读取旧消息。
但是,请记住,新字段不会出现在旧消息中,因此您需要对默认值进行合理的处理。使用特定于类型的:对于字符串,默认值为空字符串。对于布尔值,默认值为false。对于数字类型,默认值为零。
反射可以使用反射API以编程方式检查消息描述符(.proto文件中的信息)和消息实例。 在编写通用代码(例如不同的文本格式或智能差异工具)时,此功能很有用。 每个生成的类都有一个静态的Descriptor属性,并且可以使用IMessage.Descriptor属性来检索任何实例的描述符。 作为如何使用它们的一个快速示例,这是一种打印任何消息的顶级字段的简短方法。
public void PrintMessage(IMessage message) { var descriptor = message.Descriptor; foreach (var field in descriptor.Fields.InDeclarationOrder()) { Console.WriteLine( "Field {0} ({1}): {2}", field.FieldNumber, field.Name, field.Accessor.GetValue(message); } }参考文档
https://developers.google.com/protocol-buffers/docs/csharptutorial