C#实现的序列化通用类实例

yizhihongxing

C#实现的序列化通用类实例

介绍

在C#中,序列化是将对象转换为流的过程,以便将其存储在磁盘或通过网络传输。反序列化则是将对象流转换回对象的过程。序列化通用类是一个可以将对象序列化为数据流或从数据流中反序列化的类,它可用于序列化不同类型的对象。

实现过程

  1. 创建配置文件(可选)

在整个应用程序中,配置文件非常重要,它包含着我们程序的基本配置信息。序列化通用类也可以使用配置文件来节省程序内部实现,例如常用的XML格式来存放序列化器的基本配置属性(比如类型、命名空间、加密等),再在软件初始化时读取到内存中,这样使得程序的调整、升级和实现相对容易和快捷。

  1. 构建类库文件

构建一个序列化通用的类库文件,例如创建一个名为Serializations类库。该类库文件中包含了一些基础的序列化方法,还可以根据具体需求添加自定义的方法。

  1. 序列化通用类的基本方法

在序列化通用类中,创建基本的序列化和反序列化方法,可用以下代码实现:

public static byte[] Serialize<T>(T obj)
{
    if (obj == null)
    {
        return null;
    }
    using (MemoryStream ms = new MemoryStream())
    {
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        binaryFormatter.Serialize(ms, obj);
        return ms.ToArray();
    }
}

public static T Deserialize<T>(byte[] bytes)
{
    if (bytes == null)
    {
        return default(T);
    }
    using (MemoryStream ms = new MemoryStream(bytes))
    {
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        object obj = binaryFormatter.Deserialize(ms);
        return (T)obj;
    }
}

代码中使用了 BinaryFormatter 类将对象序列化成二进制数据,并使用内存流将序列化后的二进制数据写入到内存中。反序列化也同样使用 BinaryFormatter 类将内存流中的二进制数据转换成对象。

  1. 自定义序列化和反序列化方法

如果需要实现自定义的序列化和反序列化方法,可以继承IFormatter接口,并实现Serialize方法和Deserialize方法,如下所示:

public class MyFormatter : IFormatter
{
    public SerializationBinder Binder { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
    public StreamingContext Context { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
    public ISurrogateSelector SurrogateSelector { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }

    public object Deserialize(Stream serializationStream)
    {
        throw new NotImplementedException();
    }

    public void Serialize(Stream serializationStream, object graph)
    {
        throw new NotImplementedException();
    }
}

使用时只需要将MyFormatter类添加到序列化通用类即可自定义序列化和反序列化方法。

  1. 示例

下面是两个简单的示例说明如何使用序列化通用类:

(1)创建一个Person类,包含Name,Age两个属性,及构造函数。

public class Person 
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age) 
    {
        this.Name = name;
        this.Age = age;         
    } 
}

在项目中需要序列化这个对象,可以先定义一个这个类型的对象,然后使用序列化类库的Serialize方法序列化,并可以通过反序列化类库的DeSerialize方法来获取该对象。

Person person = new Person("Tom", 28);
byte[] bytes = Serializations.Serialize<Person>(person);
Person newPerson = Serializations.Deserialize<Person>(bytes);

(2)创建一个Animal基类,包含一个属性Name,及ToString方法,创建两个子类Dog,Cat。

public class Animal 
{
    public string Name { get; set; }
    public Animal(string name) 
    {
        this.Name = name;
    } 

    public override string ToString()
    {
        return $"Name:{this.Name}";
    }
}

public class Dog : Animal 
{
    public int Age { get; set; }
    public Dog(string name, int age) : base(name)
    {
        this.Age = age;
    }
    public override string ToString()
    {
        return $"{base.ToString()},Age:{this.Age}";
    }
}

public class Cat : Animal 
{
    public bool IsCute { get; set; }
    public Cat(string name, bool isCute) : base(name)
    {
        this.IsCute = isCute;
    }
    public override string ToString()
    {
        return $"{base.ToString()},IsCute:{this.IsCute}";
    }
}

在项目中需要序列化这个对象,可以先定义一个这个类型的对象列表,使用序列化类库的Serialize方法序列化,并可以通过反序列化类库的DeSerialize方法来获取该对象列表。

List<Animal> animalList = new List<Animal>();
animalList.Add(new Dog("Spike", 3));
animalList.Add(new Cat("Tom", true));
byte[] bytes = Serializations.Serialize<List<Animal>>(animalList);
List<Animal> newAnimalList = Serializations.Deserialize<List<Animal>>(bytes);

结论

通过本文分析可以看到C#实现的序列化通用类非常方便且实用,可以用于快速实现串行化和反串行化过程,同时还支持自定义功能和属性,并且灵活扩展。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现的序列化通用类实例 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • netcore mvc efcore 简单框架搭建+增删改查

    该例子使用的数据库是 mysql;.net core 框架,版本(sdk)是3.1。 一:创建个net core 版本的mvc  目标框架选   net core3.1  二:项目创建好之后  先安装今天要使用到的nuget包(下载的包最好也是3.1版本的) Microsoft.EntityFrameworkCore; Microsoft.EntityFra…

    C# 2023年4月19日
    00
  • 盘点C# 9.0中好用的特性

    顶级语句 将类和类里面Main函数省略,只留下核心的逻辑代码就是顶级语句! 1.顶级语句1 await System.Threading.Tasks.Task.Delay(1000); System.Console.WriteLine(“Hi!”); return 0; static class $Program { static async Task&lt…

    C# 2023年4月24日
    00
  • .net实现裁剪网站上传图片的方法

    实现裁剪网站上传图片的方法需要以下步骤: 1. 安装相关依赖 安装 .NET Core SDK 安装 ImageSharp 包(用于图片处理) 可以使用以下命令安装 ImageSharp 包: dotnet add package SixLabors.ImageSharp 2. 实现图片上传功能 可以使用 ASP.NET Core 提供的 IFormFile…

    C# 2023年5月31日
    00
  • .Net常见问题之C#中的委托

    关于”.Net常见问题之C#中的委托”,我将从概念、使用和示例方面进行详细讲解。 概念 C#中的委托是指一个函数指针,它允许开发者将方法作为参数进行传递。委托可以用于事件处理、回调函数以及多线程编程。 委托是一个类型,它定义了一个函数签名(包括返回值类型、参数列表和参数类型)。委托类型的对象可包装对那些具有相同返回类型和参数类型的方法的引用。 使用 使用委托…

    C# 2023年6月7日
    00
  • asp.net MVC分页代码分享

    关于“ASP.NET MVC分页代码分享”的攻略,我将从以下几个方面进行详细讲解: MVC分页原理简介 分页代码实现过程 示例说明 1. MVC分页原理简介 分页的目的是为了减少在一次性返回过多结果的情况下对服务器和数据库的压力,同时让用户更加方便的获取所需要的数据。MVC分页主要分为两个部分,分别是分页查询和分页显示。分页查询主要是通过参数指定需要返回的数…

    C# 2023年5月31日
    00
  • C#构造函数在基类和父类中的执行顺序

    C#中的构造函数是用来初始化类中的成员变量的特殊方法。在类继承中,派生类会继承基类的构造函数,同时也可以自定义自己的构造函数。 构造函数在派生类的实例化过程中,会按照一定的规则执行基类和派生类中的构造函数,其执行顺序如下: 先执行基类的构造函数。 继续执行派生类的构造函数。 这个顺序是由 C# 引入的可靠构造函数(Reliable Constructor)原…

    C# 2023年6月7日
    00
  • 深入理解C#窗体关闭事件

    好的!深入理解C#窗体关闭事件的完整攻略如下: 1. 了解窗体关闭事件 在C#中,窗体关闭事件是由Form类的Closing和Closed事件所触发的。Closing事件在关闭窗体之前触发,Closed事件则在窗体已经关闭之后触发。这两个事件可以用于对关闭窗体的操作进行拦截、处理以及清理工作。 以下是相关的代码片段: private void Form1_F…

    C# 2023年5月15日
    00
  • C# 迭代器分部类与索引器详情

    让我通过以下标题,详细讲解C#迭代器分部类与索引器的详情: 1. 迭代器分部类 1.1 什么是迭代器 在C#中,迭代器是一种用于简化类似于集合、列表、数组等序列的遍历操作的机制。使用迭代器,我们可以通过简单且易于理解的方式遍历序列,而无需考虑复杂的内部实现。 1.2 什么是迭代器分部类 迭代器分部类是一种特殊的类类型,它可以在多个文件中声明并定义,在编译时会…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部