在C#中,可以通过实现自定义集合的序列化和反序列化来保存和加载集合数据。这通常涉及到实现 ISerializable
接口或使用数据契约(Data Contract)序列化。下面我将展示这两种方法。
方法一:使用 ISerializable
接口
-
定义自定义集合类:首先需要定义一个自定义集合类,比如一个基于
List<T>
的类。 -
实现
ISerializable
接口:然后需要实现ISerializable
接口,包括一个构造函数和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
{// 序列化构造函数protected MyCustomCollection(SerializationInfo info, StreamingContext context){// 从序列化信息中恢复数据var items = (T[])info.GetValue("Items", typeof(T[]));AddRange(items);}// 实现 ISerializable 接口的 GetObjectData 方法public void GetObjectData(SerializationInfo info, StreamingContext context){// 将数据添加到序列化信息中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 序列化可以更方便地处理复杂对象和集合,并且不需要实现 ISerializable
接口。
-
定义自定义集合类:定义一个自定义集合类。
-
应用 Data Contract 属性:在类和成员上应用
DataContract
和DataMember
属性。 -
序列化和反序列化:使用
DataContractSerializer
类进行序列化和反序列化。
以下是一个示例:
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;[DataContract]
public class MyCustomCollection<T> : List<T>
{// 因为 List<T> 已经包含 DataMember 属性,这里不需要额外定义// 可以添加额外的自定义属性并标记为 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);}}}
}