我已经在c#
中写了这个protobuf消息C#客户端:
public AddressBook InitializeAdressBook() {
Person newContact = new Person();
AddressBook addressBookBuilder = new AddressBook();
Person john = new Person();
john.id=1234;
john.name="John Doe";
john.email="jdoe@example.com";
Person.PhoneNumber nr = new Person.PhoneNumber();
nr.number="5554321";
john.phone.Add(nr);
addressBookBuilder.person.Add(john);
TextBox.Text += ("Client: Initialisiert? " + addressBookBuilder.ToString()) + "\t" + "\n";
TextBox.Text += " Erster Person " + addressBookBuilder.person.First().name + "\t" + "\n";
return addressBookBuilder;
}
问题
我正在尝试从c#客户端向此java服务器发送一个protobuf消息...
Java服务器
public ControllerThread(Socket s){
this.s = s;
try {
AddressBook adb = AddressBook.parseFrom(s.getInputStream());
System.out.println("Server: Addressbook:" + adb.getPersonCount());
} catch (IOException e) {
System.out.println("Server: BufferedReader oder PrintWriter von ThermoClient konnte nicht erstellt werden");
e.printStackTrace(); }
}
}
问题:
我应该将此消息序列化为字节数组,以便我可以将其发送到java服务器... 不幸的是,方法 ProtoBuf.Serializer.Serialize 不会返回一个字节数组。 那么如何将其序列化为字节数组并将其发送到我的Java服务器?任何帮助表示感谢!
答案 0 :(得分:4)
protobuf-net(又名ProtoBuf.Serializer.Serialize
)写入流。如果您将套接字作为NetworkStream
提供,则可以直接写入该套接字。如果您真的想要byte[]
,请使用MemoryStream
:
byte[] data;
using(var ms = new MemoryStream()) {
Serializer.Serialize(ms, obj);
data = ms.ToArray();
}
答案 1 :(得分:1)
首先,您最好仔细检查Java服务器的协议。如上所述here protobuf不是自我划分的。这意味着如果您有TCP连接并且正在发送多个protobuf消息,则必须有一些其他基础协议来处理成帧 - 确定一条消息的结束位置和另一条消息的开始。
现在让我们忽略这个问题。序列化消息的实际代码取决于您使用的C#/ protobuf库。如果你使用Jon Skeet的protobuf-csharp-port,你可以用这种方式序列化它:
AddressBook book = InitializeAddressBook();
byte[] bookBytes = book.ToByteArray();
bookBytes是地址簿,序列化为字节数组。然后使用您想要的任何套接字库(例如TcpClient)将数据(bookBytes)发送到Java服务器。
我不相信这会有效,因为我认为您没有告诉我们有关Java服务器的详细信息。