2015-10-14 54 views
0

我正在寫其中Ac#客戶端調用在服務器中處理的API,將在不同的語言(Java,C,C++等) 兩種方法都被寫入的過程間通信協議在同一臺機器上運行和通信層本身不是問題(目前我使用的插座,因爲它是由大多數語言的支持,但可能會使用後共享內存) 目前正處在共約180的API,每個課程都有自己的設置各種類型的參數。由於服務器可以用任何語言編寫,因此我將所有參數轉換爲一個字節數組,並將其放入包含API標識符的數據包中,並將其發送到另一個將根據API標識符進行解碼的進程。來自服務器進程的返回數據將以相同的方式進行格式化。進程間通信分組創建

什麼我正在尋找的是,需要可變數量的不同類型的參數,並把它們轉換成一個字節數組的最快方式(和優選地爲單功能)。目前,我使用BitConverter類將每個參數轉換爲一個字節數組,並將所有數組連接成一個。除字符串外沒有引用類型參數,它們將被轉換爲包含字符串長度的前2個字節的字節數組。我可以控制客戶端和服務器,因此每個都知道數據包中預期的參數順序(基於API ID)和每個參數的大小。

如果有另一種方式來做到這一點或如何使用單一功能像這樣做:

byte[] toByteArray (variable-number of different-type parameters…) 

請讓我知道。性能是一個問題,因爲API調用的頻率非常高。

回答

0

我選擇了使用下面的代碼的特定代碼。最初擔心使用params和裝箱/取消裝箱的性能打擊,但在一些分析後,結果可以忽略不計。這裏是任何有興趣的人。

public static int ToByteArray (byte[] bytes, int Offs, params object[] args) 
    { 
     int CurrIdx = Offs; 

     for (int i=0; i<args.Length; i++) 
     { 
      object obj = args[i]; 
      if (obj is int) 
      { 
       int x = (int) obj; 
       bytes[CurrIdx++] = (byte)(x & 0xff); 
       bytes[CurrIdx++] = (byte)((x >> 8) & 0xff); 
       bytes[CurrIdx++] = (byte)((x >> 16) & 0xff); 
       bytes[CurrIdx++] = (byte)((x >> 24) & 0xff); 
      } 
      else if (obj is double) 
      { 
       double x = (double)obj; 
       System.Buffer.BlockCopy(BitConverter.GetBytes(x), 0, bytes, CurrIdx, sizeof(double)); 
       CurrIdx += sizeof(double); 
      } 
      else if (obj is string) 
      { 
       string x = (string)obj; 
       int ByteLen = x.Length * sizeof(char); 
       bytes[CurrIdx++] = (byte)(x.Length & 0xff); 
       bytes[CurrIdx++] = (byte)((x.Length >> 8) & 0xff); 
       System.Buffer.BlockCopy(x.ToCharArray(), 0, bytes, CurrIdx, ByteLen); 
       CurrIdx += ByteLen; 
      } 
     } 
     return (CurrIdx - Offs); 
    }