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

C++/CLI 序列化實戰:從基礎概念到代碼實現

     編輯:VC 教學

什麼是序列化?

序列化是將物件轉換為可儲存或傳輸的外部格式(如二進位檔案、網路資料流)的過程;反序列化則是將該格式還原為記憶體中的物件。在 C++/CLI 中,System::Runtime::Serialization::Formatters::Binary::BinaryFormatter 是最常用的二進位序列化工具,支援基本型別、陣列、日期時間及自訂型別。

核心步驟

  1. 建立 BinaryFormatter 實例。
  2. 開啟 FileStream(FileMode::Create 寫入、FileMode::Open 讀取)。
  3. 呼叫 Serialize 寫入物件,Deserialize 讀取並轉型。
  4. 關閉資料流釋放資源。

完整範例解析

下列程式碼示範將字串、整數陣列、二維浮點數陣列、布林值、日期時間、整數、字元、單精度浮點數依序序列化至 Sr01.ser,再依序反序列化並輸出驗證:

using namespace System;
using namespace System::IO;
using namespace System::Runtime::Serialization::Formatters::Binary;

int main()
{
    array<int>^ intArray = {10, 20, 30};
    array<float,2>^ floatArray = {
        {1.2F, 2.4F},
        {3.5F, 6.8F},
        {8.4F, 9.7F}
    };
    DateTime dt = DateTime::Now;
    Console::WriteLine("dt >{0}<", dt);

    BinaryFormatter^ formatter = gcnew BinaryFormatter;
    Stream^ file = File::Open("Sr01.ser", FileMode::Create);

    formatter->Serialize(file, "Hello");
    formatter->Serialize(file, intArray);
    formatter->Serialize(file, floatArray);
    formatter->Serialize(file, true);
    formatter->Serialize(file, dt);
    formatter->Serialize(file, 1000);
    formatter->Serialize(file, L'X');
    formatter->Serialize(file, 1.23456F);
    file->Close();

    file = File::Open("Sr01.ser", FileMode::Open);
    String^ s = static_cast<String^>(formatter->Deserialize(file));
    Console::WriteLine("String >{0}<", s);

    array<int>^ newIntArray = static_cast<array<int>^>(formatter->Deserialize(file));
    Console::WriteLine("newIntArray:");
    for (int i = 0; i < newIntArray->Length; ++i)
        Console::Write(" {0}", newIntArray[i]);
    Console::WriteLine();

    array<float,2>^ newFloatArray = static_cast<array<float,2>^>(formatter->Deserialize(file));
    Console::WriteLine("newFloatArray:");
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 2; ++j)
            Console::Write(" {0}", newFloatArray[i,j]);
        Console::WriteLine();
    }

    bool b = static_cast<bool>(formatter->Deserialize(file));
    Console::WriteLine("bool >{0}<", b);
    DateTime newDT = static_cast<DateTime>(formatter->Deserialize(file));
    Console::WriteLine("newDT >{0}<", newDT);
    int v = static_cast<int>(formatter->Deserialize(file));
    Console::WriteLine("int >{0}<", v);
    wchar_t c = static_cast<wchar_t>(formatter->Deserialize(file));
    Console::WriteLine("wchar_t >{0}<", c);
    float f = static_cast<float>(formatter->Deserialize(file));
    Console::WriteLine("float >{0}<", f);
    file->Close();
}

關鍵點提醒

  • 序列化順序必須與反序列化順序完全一致。
  • Deserialize 回傳 Object^,需使用 static_cast 轉為原始型別。
  • 自訂類別需標記 [Serializable] 屬性才能被序列化。
  • 二進位格式不具人類可讀性,跨平台或版本相容性較差;若需互通性可改用 SoapFormatter 或 JSON/XML 序列化。

適用場景

本機快取、進程間資料傳遞、簡單持久化儲存。對於複雜物件圖或長期儲存,建議考慮 DataContractSerializer 或第三方函式庫(如 Newtonsoft.Json)。

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