2

このprotobufメッセージをc#で書きました

  • 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# クライアントからこの 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 サーバーに送信するにはどうすればよいでしょうか? どんな助けでも感謝します!

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 サーバーのプロトコルを再確認することをお勧めします。here で説明されているように、 protobuf は自己区切りではありません。これは、TCP 接続があり、複数の protobuf メッセージを送信している場合、フレーミングを処理する他の基になるプロトコルが必要であることを意味します。つまり、1 つのメッセージがどこで終了し、別のメッセージが開始するかを決定します。

今のところ、その問題は無視しましょう。メッセージをシリアル化する実際のコードは、使用している 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 に答える