2

我已经用 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;
        }
    

问题

我正在尝试将 protobuf 消息从 ac# 客户端发送到此 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 服务器呢?任何帮助表示感谢!

4

2 回答 2

4

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

byte[] data;
using(var ms = new MemoryStream()) {
     Serializer.Serialize(ms, obj);
     data = ms.ToArray();
}
于 2012-11-02T06:56:54.200 回答
1

首先,您最好仔细检查 Java 服务器的协议。如此处所述 protobuf 不是自定界的。这意味着如果你有一个 TCP 连接并且正在发送多个 protobuf 消息,则必须有一些其他的底层协议来处理帧 - 确定一个消息在哪里结束,另一个在哪里开始。

让我们暂时忽略这个问题。序列化消息的实际代码取决于您使用的 C#/protobuf 库。如果你使用 Jon Skeet 的protobuf-csharp-port你可以这样序列化它:

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

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

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

于 2012-10-31T20:00:30.867 回答