簡體   English   中英

在C ++中序列化/反序列化簡單協議的最佳方法

[英]Best way of serializing/deserializing a simple protocol in C++

我想在Linux上使用C ++中的Berkeley套接字構建一個簡單的應用程序協議。 傳輸層應為UDP,協議將包含以下兩部分:

第一部分:

它是一個固定的部分,它是具有以下字段的協議Header:

1. int HeaderType
2. int TransactionID
3. unsigned char Source[4]
4. unsigned char Destination[4]
5. int numberoftlvs

第二部分

它將包含可變數量的TLV,每個TLV將包含以下字段:

1. int type
2. int length
3. unsigned char *data "Variable length"

我的問題是准備通過網絡發送的消息,什么是串行化和反序列化的最佳方式,可以在所有系統上移植,如小端和大端?

我應該准備一個“unsigned char”的大緩沖區,並開始逐個復制字段嗎? 之后,只需調用send命令?

如果我要按照前面的方式,我怎么能繼續跟蹤指向復制字段的位置的指針,我的猜測是為每個數據類型構建一個能知道移動指針的字節數的函數,對嗎?

如果有人可以為我提供一個解釋良好的例子,那將非常感激。

一些想法......沒有特別的順序......而且可能沒有任何意義

  • 你可以有一個Buffer類。 這個類包含原始內存指針,您可以在其中編寫消息,它可以包含計數器或指針,以記錄您編寫的內容,編寫的位置以及可以走多遠。
  • 可能你想為每個線程讀/寫都有一個Buffer類的實例。 不多了,因為你不想擁有這樣的昂貴的緩沖區。 綁定到特定線程,因為您不想在沒有鎖定的情況下共享它們(並且鎖定很昂貴)
  • 您可能希望從一條消息到下一條消息重用Buffer,從而避免創建和銷毀它的成本。
  • 您可能希望探索Decorator的概念,該類是繼承或包含每個數據類的類。 在這種情況下,他們想知道這個裝飾器是包含序列化和反序列化每個數據類型的方法。
  • 一個選項是使Decorator成為模板並使用類模板特化來提供不同的格式。
  • 結合Decorator方法和Buffer方法,您應該擁有所需的所有控件。
  • 您可以在Buffer類中使用具有仲裁對象作為參數的神奇模板化方法 ,並自動為其創建一個Decorator並進行序列化。
  • 相反,反序列化應該為你提供一個可以轉換為裝飾類型的裝飾器。

對不起,我現在沒有時間給你一個完整的例子,但我希望上面的想法能讓你開始。

作為一個例子,我無恥地插入我自己的(de)序列化庫,它包裝成msgpackv5格式: 亂舞

暫無
暫無

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

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