在C#中,可以通過實現(xiàn)自定義集合的序列化和反序列化來保存和加載集合數(shù)據(jù)。這通常涉及到實現(xiàn) ISerializable 接口或使用數(shù)據(jù)契約(Data Contract)序列化。下面我將展示這兩種方法。
方法一:使用 ISerializable 接口
定義自定義集合類:首先需要定義一個自定義集合類,比如一個基于 List<T> 的類。
實現(xiàn) ISerializable 接口:然后需要實現(xiàn) ISerializable 接口,包括一個構(gòu)造函數(shù)和 GetObjectData 方法。
序列化和反序列化:編寫序列化和反序列化的方法。
以下是一個示例:
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
public class MyCustomCollection<T> : List<T>, ISerializable
{
// 序列化構(gòu)造函數(shù)
protected MyCustomCollection(SerializationInfo info, StreamingContext context)
{
// 從序列化信息中恢復(fù)數(shù)據(jù)
var items = (T[])info.GetValue("Items", typeof(T[]));
AddRange(items);
}
// 實現(xiàn) ISerializable 接口的 GetObjectData 方法
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
// 將數(shù)據(jù)添加到序列化信息中
info.AddValue("Items", ToArray());
}
// 序列化方法
public byte[] Serialize()
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, this);
return ms.ToArray();
}
}
// 反序列化方法
public static MyCustomCollection<T> Deserialize(byte[] data)
{
using (var ms = new MemoryStream(data))
{
var formatter = new BinaryFormatter();
return (MyCustomCollection<T>)formatter.Deserialize(ms);
}
}
}
// 使用示例
class Program
{
static void Main()
{
var collection = new MyCustomCollection<int> { 1, 2, 3, 4, 5 };
// 序列化
byte[] serializedData = collection.Serialize();
// 反序列化
var deserializedCollection = MyCustomCollection<int>.Deserialize(serializedData);
// 輸出反序列化后的集合
foreach (var item in deserializedCollection)
{
Console.WriteLine(item);
}
}
}
方法二:使用 Data Contract 序列化
使用 Data Contract 序列化可以更方便地處理復(fù)雜對象和集合,并且不需要實現(xiàn) ISerializable 接口。
定義自定義集合類:定義一個自定義集合類。
應(yīng)用 Data Contract 屬性:在類和成員上應(yīng)用 DataContract 和 DataMember 屬性。
序列化和反序列化:使用 DataContractSerializer 類進(jìn)行序列化和反序列化。
以下是一個示例:
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
[DataContract]
public class MyCustomCollection<T> : List<T>
{
// 因為 List<T> 已經(jīng)包含 DataMember 屬性,這里不需要額外定義
// 可以添加額外的自定義屬性并標(biāo)記為 DataMember
}
// 使用示例
class Program
{
static void Main()
{
var collection = new MyCustomCollection<int> { 1, 2, 3, 4, 5 };
// 序列化
using (var ms = new MemoryStream())
{
var serializer = new DataContractSerializer(typeof(MyCustomCollection<int>));
serializer.WriteObject(ms, collection);
byte[] serializedData = ms.ToArray();
// 反序列化
ms.Position = 0; // 重置流位置到開頭
var deserializedCollection = (MyCustomCollection<int>)serializer.ReadObject(ms);
// 輸出反序列化后的集合
foreach (var item in deserializedCollection)
{
Console.WriteLine(item);
}
}
}
}
該文章在 2025/1/8 10:02:55 編輯過