序列化是將物件轉換為可儲存或傳輸的外部格式(如二進位檔案、網路資料流)的過程;反序列化則是將該格式還原為記憶體中的物件。在 C++/CLI 中,System::Runtime::Serialization::Formatters::Binary::BinaryFormatter 是最常用的二進位序列化工具,支援基本型別、陣列、日期時間及自訂型別。
BinaryFormatter 實例。FileStream(FileMode::Create 寫入、FileMode::Open 讀取)。Serialize 寫入物件,Deserialize 讀取並轉型。下列程式碼示範將字串、整數陣列、二維浮點數陣列、布林值、日期時間、整數、字元、單精度浮點數依序序列化至 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)。