欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > C#中自定义集合的序列化与反序列化实现

C#中自定义集合的序列化与反序列化实现

2025/1/18 17:30:54 来源:https://blog.csdn.net/x1234w4321/article/details/144578655  浏览:    关键词:C#中自定义集合的序列化与反序列化实现

在C#中,可以通过实现自定义集合的序列化和反序列化来保存和加载集合数据。这通常涉及到实现 ISerializable 接口或使用数据契约(Data Contract)序列化。下面我将展示这两种方法。

方法一:使用 ISerializable 接口

  1. 定义自定义集合类:首先需要定义一个自定义集合类,比如一个基于 List<T> 的类。

  2. 实现 ISerializable 接口:然后需要实现 ISerializable 接口,包括一个构造函数和 GetObjectData 方法。

  3. 序列化和反序列化:编写序列化和反序列化的方法。

以下是一个示例:

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 接口。

  1. 定义自定义集合类:定义一个自定义集合类。

  2. 应用 Data Contract 属性:在类和成员上应用 DataContractDataMember 属性。

  3. 序列化和反序列化:使用 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);}}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com