二進位序列化
核心類別
[Serializable]:標記類別可序列化
BinaryFormatter:高效二進位格式,含型別資訊
[NonSerialized]:排除欄位
IDeserializationCallback:反序列化後回呼,重建衍生資料
完整範例:產品清單序列化
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
public class Products : IDeserializationCallback
{
private long _startNumber = 1;
private long _endNumber;
[NonSerialized] private long[] _products; // 不序列化,反序列化後重建
public Products(long start, long end)
{
_startNumber = start;
_endNumber = end;
RebuildProducts();
}
private void RebuildProducts()
{
_products = new long[_endNumber - _startNumber + 1];
for (long i = 0; i < _products.Length; i++)
_products[i] = _startNumber + i;
}
public void Serialize(string path)
{
using (var fs = new FileStream(path, FileMode.Create))
{
new BinaryFormatter().Serialize(fs, this);
}
}
public static Products Deserialize(string path)
{
using (var fs = new FileStream(path, FileMode.Open))
{
return (Products)new BinaryFormatter().Deserialize(fs);
}
}
// 反序列化完成後自動呼叫
public void OnDeserialization(object sender)
{
RebuildProducts(); // 依 _startNumber/_endNumber 重建陣列
}
public void Display()
{
Console.WriteLine($"Products: {string.Join(", ", _products)}");
}
public static void Main()
{
var p = new Products(1, 10);
p.Serialize("products.dat");
var p2 = Products.Deserialize("products.dat");
p2.Display(); // 輸出 1,2,3...10
}
}
序列化格式比較
| 格式化器 | 命名空間 | 特點 |
| BinaryFormatter | System.Runtime.Serialization.Formatters.Binary | 緊湊、含型別、版本容錯差 |
| SoapFormatter | System.Runtime.Serialization.Formatters.Soap | XML SOAP、可讀、效能較差 |
| XmlSerializer | System.Xml.Serialization | 僅公用屬性/欄位、可控制 XML 結構、Web Service 標準 |
| DataContractSerializer | System.Runtime.Serialization | WCF 預設、效能佳、需 [DataContract]/[DataMember] |
| JsonSerializer | System.Text.Json | .NET Core 標準、高效能、UTF-8、可自訂選項 |
ActiveX 控制項在 Windows Forms 使用
步驟
- 開發 ActiveX (VB6/VC++/Delphi),產生
.ocx
- 註冊:
regsvr32 MyControl.ocx (需系統管理員)
- Visual Studio 工具箱 → 右鍵「選擇項目」→「COM 元件」→ 勾選控制項
- 拖曳至表單,自動產生
AxInterop.xxx.dll (ActiveX 包裝) 與 Interop.xxx.dll (RCW)
程式碼呼叫
// 假設控制項名為 axCalculator,方法 Add(ref int left, ref int right)
private void btnCalc_Click(object sender, EventArgs e)
{
int left = 10, right = 20;
int result = axCalculator.Add(ref left, ref right);
labelResult.Text = result.ToString();
}
注意事項
- ActiveX 為 32 位元,專案必須設定
Prefer 32-bit 或 Platform target: x86
- 部署時需將 .ocx 註冊至目標機器
- 建議漸進式遷移至 .NET 原生控制項或 WPF/Web 替代方案