我目前正在尝试使用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连接从主机向客户端发送类的定义,以便在客户端创建对象?
答案 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消息更有效。