簡體   English   中英

序列化和發送協議緩沖區消息

[英]Serializing and Sending a Protocol Buffers Message

我已經用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#客戶端向該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服務器? 任何幫助表示感謝,謝謝!

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服務器的詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM