如何使用Protocol Buffers从主机向客户端发送类定义?

时间:2015-07-16 17:06:42

标签: c# tcp protocol-buffers protobuf-net

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

上学习本教程

在我的主机上,我有这个代码定义了一个类“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;}
    }

以及将该类序列化为.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);

不幸的是,这只有在我还有客户端上定义类“Person”的代码时才有效。 如何使用Protocol Buffers通过TCP连接从主机向客户端发送类的定义,以便在客户端创建对象?

2 个答案:

答案 0 :(得分:4)

通常,使用protobufs进行通信的系统的所有部分都需要知道这些protobufs的定义才能使用它们(您的接收类必须事先了解 do.call(rbind,Map(cbind, gr=names(lst), lapply(lst, function(x) read.table(text=x[-1])))) 的结构,以及如何反序列化它)。

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

答案 1 :(得分:4)

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

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

关键在于,在C#或C ++等编译语言中,您始终不需要生成的存根代码。但是,存根代码可能比使用这些描述符解释protobuf消息更有效。