如何使用协议缓冲区将 class 定义从主机发送到客户端?

How to send class definition from host to client using Protocol Buffers?

我目前正在尝试使用 protobuf-net 通过 TCP 连接创建 class 的对象。我对此比较陌生,所以我正在学习 https://code.google.com/p/protobuf-net/wiki/GettingStarted

上的教程

在我的主机上,我有这段代码定义了 class "Person"

    [ProtoContract]
    class Person {
    [ProtoMember(1)]
    public int Id {get; set;}
    [ProtoMember(2)]
    public string Name {get; set:}
    [ProtoMember(3)]
    public Address Address {get; set;}
    }

以及将 class 序列化为 .bin 文件的块:

var person = new Person {
    Id = 12345, Name = "Fred",
    Address = new Address {
        Line1 = "Flat 1",
        Line2 = "The Meadows"
    }
};
using (var file = File.Create("person.bin")) {
    Serializer.Serialize(file, person);
}

我将 person.bin 文件复制并粘贴到客户端的项目文件夹中,并使用以下块读取 .bin 文件并输出文件的一部分。

Person newPerson;
using (var file = File.OpenRead("person.bin")) {
    newPerson = Serializer.Deserialize<Person>(file);
}
Console.WriteLine("The name is: " + newPerson.name);

不幸的是,只有当我在客户端也有定义 class "Person" 的代码时,这才有效。 如何使用 Protocol Buffers 通过 TCP 连接将 class 的定义从主机发送到客户端,以便在客户端创建对象?

一般来说,使用 protobufs 进行通信的系统的所有部分都需要知道这些 protobufs 的定义才能使用它们(您的接收方 class 必须先验地知道 Person,以及如何反序列化它)。

不方便且效率低下,因为这不是通常的情况,但您可以使用自描述消息同时发送结构和数据:https://developers.google.com/protocol-buffers/docs/techniques#self-description

上面的 link 是很好的资源。我想添加一些背景知识。当您通过 --descriptor_set_out 选项告诉 protoc 生成描述符文件时,它会生成一个描述您的 class.

的文件

许多语言绑定如 node.js' 正在使用此描述符文件来理解 protobuf 编码的消息,而不是使用生成的语言存根。 Node.js 例如,正在使用此技术动态解释 protobuf 消息。

要点在于,在像 C# 或 C++ 这样的编译语言中,您并不总是需要生成的存根代码。然而,存根代码可能比使用这些描述符解释 protobuf 消息更有效。