开发学院,分享开发教程和最新动态
章节列表 什么是ProtobufProtobuf3 定义数据类型Protobuf3 标量值类型Protobuf3 缺省值Protobuf3 枚举Protobuf3 使用其他消息类型Protobuf3 嵌套类型Protobuf3 更新消息类型Protobuf3 未知字段Protobuf3 Any类型Protobuf3 OneofProtobuf3 MapsProtobuf3 包Protobuf3 定义服务Protobuf3 JSON映射Protobuf3 可选项Protobuf3 生成属于自己的类Protobuf 风格指南Protobuf 编码(1)Protobuf 编码(2)Protobuf 编码(3)Protobuf 技术Protocol Buffer C++实例教程: 为什么使用Protocol Buffer?Protocol Buffer C++实例教程: 定义协议格式Protocol Buffer C++实例教程: 编译Protocol BufferProtocol Buffer C++实例教程: Protocol Buffer APIProtocol Buffer C++实例教程: 发送消息Protocol Buffer C++实例教程: 读取消息Protocol Buffer C++实例教程: 扩展Protocol BufferProtocol Buffer C++实例教程: 优化技巧和高级用法Protocol Buffer C#实例教程: 前言Protocol Buffer C#实例教程:定义协议格式Protocol Buffer C#实例教程:编译Protocol Buffer Protocol Buffer C#实例教程:解析和序列化Protocol Buffer Go实例教程:前言Protocol Buffer Go实例教程:定义协议格式Protocol Buffer Go实例教程:编译Protocol BufferProtocol Buffer Go实例教程:读写消息Protocol Buffer JAVA实例教程:前言Protocol Buffer JAVA实例教程:定义协议格式Protocol Buffer JAVA实例教程:编译Protocol BufferProtocol Buffer JAVA实例教程:Protocol Buffer APIProtocol Buffer JAVA实例教程:写消息Protocol Buffer JAVA实例教程:读消息Protocol Buffer JAVA实例教程:扩展Protocol BufferProtocol Buffer Python实例教程:前言Protocol Buffer Python实例教程:定义消息格式Protocol Buffer Python实例教程:编译Protocol BufferProtocol Buffer Python实例教程:Protocol Buffer APIProtocol Buffer Python实例教程:写消息Protocol Buffer Python实例教程:读取MessageProtocol Buffer Python实例教程:扩展Protocol Buffer

Protocol Buffer C#实例教程:解析和序列化

  使用protocol buffer的全部目的是序列化您的数据,以便可以在其他地方对其进行解析。每个生成的类都有一个WriteTo(CodedOutputStream )方法,其中CodedOutputStream是protocol buffer库中的一个类。但是,通常您会使用扩展方法之一来写入常规系统。将消息流式传输或转换成字节数组或字节字符串。这些扩展信息Google.Protobuf.MessageExtensions类,所以当你想序列化的时候,你通常需要一个Google.Protobuf 命名空间。例如:

using Google.Protobuf;
...
Person john = ...; // Code as before
using (var output = File.Create("john.dat"))
{
    john.WriteTo(output);
}

  解析也很简单,每个生成的类都有一个静态解析器属性,该属性返回该类型的消息解析器<T>。这反过来又有解析流、字节数组和字节串的方法。为了解析我们刚刚创建的文件,我们可以使用:

Person john;
using (var input = File.OpenRead("john.dat"))
{
    john = Person.Parser.ParseFrom(input);
}

  Github存储库中提供了一个完整的示例程序来维护地址簿(添加新条目并列出现有条目)。

扩展Protocol Buffer

  在您发布使用Protocol Buffer的代码后,您迟早会毫无疑问地想要“改进”Protocol Buffer的定义。如果你想让你的Protocol Buffer向后兼容,让你的旧缓冲区向前兼容:你肯定想这样做,那么你需要遵守一些规则。在新版本的Protocol B\

  •   您不能更改任何现有字段的标签号。

  •   您可以删除字段。

  •   您可以添加新字段,但必须使用新的标签号(即,从未在此Protocol Buffer中使用过的标签号,甚至未被删除的字段使用过)。

  (这些规则有一些例外,但很少使用。)

  如果您遵循这些规则,旧代码将愉快地阅读新消息,并简单地忽略任何新字段。对于旧代码,被删除的单个字段将只具有它们的默认值,被删除的重复字段将为空。新代码也会透明地读取旧消息。

  但是,请记住,新字段不会出现在旧消息中,因此您需要用默认值做一些合理的事情。使用特定类型的默认值:对于字符串,默认值是空字符串。对于布尔值,默认值为false。对于数值类型,默认值为零。

反射

  消息描述符(信息中的.proto文件)和消息实例可以使用反射API以编程方式进行检查。这在编写通用代码时非常有用,例如不同的文本格式或智能比较工具。每个生成的类都有一个静态描述符属性,并且可以使用IMessage检索任何实例的描述符。描述符属性。作为如何使用这些的快速示例,这里有一个打印任何消息的顶级字段的简短方法。

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);
    }
}

  除非另有说明,本页面的内容是根据知识共享属性3.0许可证许可的,代码示例是根据Apache 2.0许可证许可的。有关详细信息,请参见谷歌开发者网站策略。Java是甲骨文和/或其附属公司的注册商标。