在C#中,可以通過(guò)實(shí)現(xiàn)自定義集合的序列化和反序列化來(lái)保存和加載集合數(shù)據(jù)。這通常涉及到實(shí)現(xiàn) ISerializable 接口或使用數(shù)據(jù)契約(Data Contract)序列化。下面我將展示這兩種方法。
方法一:使用 ISerializable 接口
定義自定義集合類(lèi):首先需要定義一個(gè)自定義集合類(lèi),比如一個(gè)基于 List<T> 的類(lèi)。
實(shí)現(xiàn) ISerializable 接口:然后需要實(shí)現(xiàn) ISerializable 接口,包括一個(gè)構(gòu)造函數(shù)和 GetObjectData 方法。
序列化和反序列化:編寫(xiě)序列化和反序列化的方法。
以下是一個(gè)示例:
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); }
// 實(shí)現(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ù)雜對(duì)象和集合,并且不需要實(shí)現(xiàn) ISerializable 接口。
定義自定義集合類(lèi):定義一個(gè)自定義集合類(lèi)。
應(yīng)用 Data Contract 屬性:在類(lèi)和成員上應(yīng)用 DataContract 和 DataMember 屬性。
序列化和反序列化:使用 DataContractSerializer 類(lèi)進(jìn)行序列化和反序列化。
以下是一個(gè)示例:
using System;using System.Collections.Generic;using System.IO;using System.Runtime.Serialization;
[DataContract]public class MyCustomCollection<T> : List<T>{ // 因?yàn)?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; // 重置流位置到開(kāi)頭 var deserializedCollection = (MyCustomCollection<int>)serializer.ReadObject(ms);
// 輸出反序列化后的集合 foreach (var item in deserializedCollection) { Console.WriteLine(item); } } }}
該文章在 2025/1/8 10:02:55 編輯過(guò)