2012-04-18 102 views

回答

4

根本的問題是,「如何序列化/在 語言無關的方式?反序列化對象」具體Java和C,你的情況。由於您要通過網絡發送此數據,所以請注意network order/endianness問題也很重要。

我假設你可以訪問客戶端和服務器。這意味着你需要 來選擇如何序列化數據。 (如果沒有,答案很簡單,寫 以對方的期望爲準)

就個人而言,我會用Protocol Buffers。 有Java bindingsC bindings

如果你不喜歡Protocol Buffers的,還有其他選項,如:

  • JSON(已經提到)
  • YAML
  • 阿帕奇​​
  • XDR
  • 滾你自己
  • ...
+0

是的,我有權訪問這兩者。 這是哪個更好的解決方案(最快)? – user655561 2012-04-19 03:20:34

+0

除非將原始內存丟棄到網絡中,否則無需擔心排列順序。請參閱Rob Pike在http://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html上的精彩討論(如果名字不熟悉,Pike是Unix的發明者之一。) – 2012-04-19 21:54:10

3

將Java對象的字段寫入字符串(可能爲JSON),通過TCP發送它們,讓C程序讀取字符串並使用它在另一端初始化新的C變量。

+0

我已經想過這個解決方案。但我堅持從java發送字符串到C,我成功發送的唯一東西是Char。我雖然約: 1發送一個整數,表示字符串的長度。 2 - 做動態分配 2 - 按字符發送字符串 我相信這個解決方案速度慢,性能不高的問題。 那你覺得呢? – user655561 2012-04-19 14:45:32

+0

爲了提高性能,您希望儘可能多地在一個數據包中發送儘可能多的數據,但這完全取決於您如何表示數據。例如,您可以將數字160作爲一個二進制'A0'字節發送,或者可以將它作爲3個字符'1','6','0'發送,或者您可以發明一些其他表示。唯一重要的是發送者和接收者對錶示達成一致。而且你可以保證,因爲你可以控制兩端。 @Pablo Maurin建議使用協議緩衝區是非常合理的。 – 2012-04-19 21:50:53

1

這個問題很舊,但爲防萬一有人仍在尋找一個好的解決方案,您可以嘗試使用協議緩衝區實現,正如@Adam Liss先前回答中所述:(developers.google。 COM /協議緩衝器/)

總之,可以定義任何複雜的消息類型爲在協議實現,該工具產生C++ /爪哇/ Python代碼可序列化和反序列化。

出於同樣的目的,使用C代碼,德國慕尼黑工業大學(TUM)的一個研究項目已經創建了一個標準C的代碼生成器,可用於嵌入式C項目。這與Google的protobuf實現完全兼容(由於C結構的限制)。這比C Bindings更好,因爲它不需要鏈接任何庫。 我在獲得C Bindings在我正在使用的嵌入式系統上工作時遇到問題,因爲它需要與支持庫鏈接。

這救了我的(痛苦)的一天,我的嵌入式項目 - 嵌入式系統和Android應用程序(JAVA)/桌面應用(C++/QT)之間傳遞複雜的網絡數據(請求 - 響應)。