首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 序列化方案深度對比:Protobuf vs Boost.Serialization 實戰心得

     編輯:C++ 入門

什麼是序列化?

將物件在記憶體中的狀態轉換為可儲存、可傳輸的位元組流(或文本流)的過程。逆過程為反序列化。核心用途:

  1. 持久化:物件存檔,下次啟動快速載入,避免重複昂貴計算。
  2. 網路傳輸:跨進程、跨機器、跨語言傳遞結構化資料。

C++ 四大序列化方案概覽

方案優點缺點適用場景
Google Protobuf極高效能、跨語言(C++/Java/Python)、體積小、向前/向後相容需預定義 .proto 再編譯、不支援 STL 容器、不支援二維陣列/指標高效能內部 RPC、跨語言服務、資料定義穩定
Boost.Serialization非侵入式、完美支援 STL/智慧指標/多態、多種格式(二進制/XML/文本)、純 C++ 模板實現編譯慢、庫巨大(安裝繁瑣)、基本型別指標難序列化、不支援變長陣列複雜 C++ 物件圖持久化、需 STL 容器、不想改動既有類別
MFC SerializationVisual Studio 整合好、CObject 體系原生支援僅限 Windows、效率低、綁定 MFC舊 MFC 專案維護
.NET Framework跨語言(CLR)、自動處理版本、支援完整物件圖需 .NET Runtime、非標準 C++.NET 生態內部

Protobuf 實戰避坑指南

1. 支援的資料型別對照表(必收藏)

.proto 型別C++ 型別備註
int32 / int64int32 / int64負數編碼低效,建議用 sint32/64
uint32 / uint64uint32 / uint64Varint 編碼
sint32 / sint64int32 / int64ZigZag 編碼,負數高效
fixed32 / fixed64uint32 / uint64固定 4/8 字節,大數值更高效
sfixed32 / sfixed64int32 / int64固定長度有符號
boolbool
stringstd::stringUTF-8 或 7-bit ASCII
bytesstd::string任意位元組序列

2. 兩大硬傷

  • 不支援 STL 容器:無 vector<vector<int>>、map、set 等。需手動展平或用 repeated 模擬一維陣列。
  • 巢狀類型會改名:message A { message B {} } 生成的類為 A_B 而非 B。解決:將巢狀類提到頂層定義。

Boost.Serialization 實戰避坑指南

1. 安裝踩坑全記錄(Ubuntu 為例)

# 必裝依賴
sudo apt-get install libbz2-dev zlib1g-dev libpython3-dev

# 源碼安裝
./bootstrap.sh
./b2 -j$(nproc) --with-serialization --with-system --with-filesystem
sudo ./b2 install

常見錯誤:

  • pyconfig.h not found → 裝 python3-dev。
  • bzlib.h not found → 裝 libbz2-dev。

2. 連結庫選擇

  • -lboost_serialization:窄字符(char)。
  • -lboost_wserialization:寬字符(wchar_t)。

3. 非侵入式序列化的條件

類別成員必須 public,或在類內聲明:

class MyClass {
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, unsigned version) {
        ar & member1 & member2;
    }
private:
    int member1; string member2;
};

4. 指標與陣列陷阱

  • 基本型別指標(int*)無法直接序列化:需包裝成結構體。
  • 動態陣列 new T[n] 不能直接序列化:需用 std::vector 或固定大小陣列 T arr[N]。
  • 物件陣列指標 new A[n] 會被當成單一物件:只序列化第一個元素。必須用 A arr[N] 或 vector<A>。

選型決策樹

需要跨語言 / 極致效能 / 結構固定? → Protobuf
需要 STL 容器 / 複雜物件圖 / 不想改既有代碼 / 純 C++? → Boost.Serialization
Windows 老專案 / MFC 體系? → MFC
.NET 生態? → .NET BinaryFormatter / JSON.NET

總結

Protobuf 輕量、快、跨語言,適合「定義一次,到處用」的服務介面。Boost.Serialization 重裝備、功能全、非侵入,適合「既有複雜 C++ 物件模型持久化」的場景。兩者互補,而非替代。根據專案實際約束選擇,切勿盲目跟風。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved