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

时间:2012-10-31 18:53:18

标签: c# serialization network-programming protocol-buffers protobuf-net

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

2 个答案:

答案 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服务器的详细信息。