序列化和发送协议缓冲消息

我在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; } 

问题

我试图从ac#client发送一个protobuf消息到这个java服务器…

  • 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服务器? 任何帮助表示感谢!

protobuf-net(又名ProtoBuf.Serializer.Serialize )写入 。 如果您将套接字作为NetworkStream ,则可以直接写入。 如果你真的想要一个byte[] ,那么使用MemoryStream

 byte[] data; using(var ms = new MemoryStream()) { Serializer.Serialize(ms, obj); data = ms.ToArray(); } 

首先,您最好仔细检查Java服务器的协议。 如前所述, protobuf不是自我划分的。 这意味着如果您有TCP连接并且正在发送多个protobuf消息,则必须有一些其他基础协议来处理成帧 – 确定一条消息的结束而另一条消息的开始。

我们暂时忽略这个问题。 序列化消息的实际代码取决于您使用的C#/ protobuf库。 如果您正在使用Jon Skeet的protobuf-csharp-port,您可以通过以下方式对其进行序列化:

 AddressBook book = InitializeAddressBook(); byte[] bookBytes = book.ToByteArray(); 

bookBytes是地址簿,序列化为字节数组。 然后使用您想要的任何套接字库(例如TcpClient )将数据(bookBytes)发送到Java服务器。

我不相信这会起作用,因为我认为有关Java服务器的细节并没有告诉我们。