結構體作為介面的注意事項

2022-04-16 09:07:40 字數 1307 閱讀 1341

在後端向前端回覆資料時,需要將結構化資料通過網路傳輸給前端,而網路傳輸是位元組流傳輸,前端收到的是一段資料,那麼,問題就落腳在如何解析這段資料。

很多請求的場景,返回的條數是動態變化的,比如訂單數量。使用者每下乙個訂單,那麼請求返回的數量就會加1.這時候,如何較好的返回動態資料呢?這個看使用怎樣的儲存格式來承載可變長度的資料返回。就目前已知的處理方法:

由於工作需要,這裡使用 struct 格式來進行資料的包裹。

比如,查詢某個使用者的賬戶餘額,返回的結構體類似如下:

struct taccountcapital : struct packethead

struct packethead為包頭結構體,裡面的內容為傳輸過程中的一些通用選項,在此不表。

當該結構體後續有擴充套件時,只要保證後續新增的字段始終放在後面,那就可以保持公升級後新舊版本的相容性。

比如,查詢某個使用者的當日訂單資訊,返回的結構體類似如下:

struct taccountorder :struct packethead

struct torderinfo

這裡用到的 linux下的 零長陣列技巧,此處不再贅述。

客戶端在接收到此類資料時,先通過sizeof(torderinfo) * m_ncount得到訂單資料的真實長度,然後以sizeof(torderinfo)為步長,將記憶體中資料整理輸出,顯示出來。

到這一步,看起來都很美好。

再往下看,隨著業務的發展,訂單資訊需要新增乙個字段,比如新增訂單折扣資訊。此時的返回結構體如下:

struct torderinfo

一旦結構體有所改變,就存在前後端面對的結構體不一致,如果前端還按照原有的步長來擷取記憶體輸出,隨後的訂單資訊就會全部錯亂。

造成這個問題的原因是前端使用的結構體與後台的不一致,後台的修改帶來了相容性問題。既然問題根源知道了,那麼解決的方法也有浮出水面了。那就是讓前端知道真正的步長,這個步長不能依賴於前端能夠看到的結構體長度,而要通過其他途徑了解真實的長度,而這個真實的長度,只有後台了解,因此,需要後台增加乙個字段,表示傳遞結構體真正的長度。

struct taccountorder :struct packethead

在使用結構體傳遞可變資料時,使用零長陣列傳輸資料時,需要增加返回的結構體大小成員。

同時,要同前端開發人員做好約定,在解析資料時,要依賴介面中的結構體大小成員,而不要依賴自己算出來的結構體成員大小。

介面的注意事項

public inte ce myinte cea 錯誤寫法,不能寫靜態 塊 abstract myinte cea 不能寫構造方法 public abstract void methoda 抽象方法不要 不能 寫方法 體 void method public static void method3...

結構體注意事項

include struct stu char name int main void struct stu student struct stu student1 strcpy student1 name,zhangsan 編譯能通過但會出現斷錯誤。strcpy student name,zhang...

結構體簡單注意事項

結構體是一些值得集合,這些值稱為成員變數.結構體的每個成員可以是不同型別的變數.甚至可以是結構體.結構體可以用 初始化,不能用 賦值 等價於 先 再 p name 等價於 p name 結構體傳參時,要傳結構體的位址.因為函式傳參的時候,引數是需要壓棧的。如果傳遞乙個結構體物件的時候,結構體過大,引...