C#中自定义集合的序列化与反序列化实现
|
admin
2025年1月8日 10:2
本文热度 52
|
在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);
}
}
}
}
该文章在 2025/1/8 10:02:55 编辑过