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

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日

相关文章

  • Unity3d怎么从物体向前方发射一条射线?

    Unity3D是一个游戏引擎,支持开发2D和3D游戏。在游戏开发中,常常需要使用射线来进行碰撞检测、瞄准、摄像机跟随等操作。本文将详细讲解在Unity3D中如何从物体向前方发射一条射线。 1. 获取射线起点和方向 使用射线需要明确射线的起点和方向,Unity3D提供了Transform组件的position属性来获取起点,可以使用Transform组件的fo…

    C# 2023年6月3日
    00
  • 基于DateTime.ParseExact方法的使用详解

    基于DateTime.ParseExact方法的使用详解 简介 C#中的DateTime.ParseExact方法是将字符串转化为DateTime类型的一种常用方式。它能够根据特定的格式将字符串解析成DateTime类型的值。在实际开发中,我们常常会遇到将字符串转化为日期类型的需求,而DateTime.ParseExact方法能够帮助我们实现这一目的。下面将…

    C# 2023年6月1日
    00
  • 分享一个asp.net pager分页控件

    Asp.NetPager是一个.NET平台上的分页控件,可以方便地实现分页功能。以下是使用Asp.NetPager实现分页功能的完整攻略。 环境准备 在使用Asp.NetPager前,需要安装Asp.NetPager包。可以使用以下命令来安装Asp.NetPager: Install-Package AspNetPager 实现分页功能 以下是使用Asp.N…

    C# 2023年5月15日
    00
  • C# Stream 和 byte[] 之间的转换

    在C#中,Stream和byte[]是常用的数据类型,用于读取和写入数据。本文将提供详细的“C#Stream和byte[]之间的转换”的完整攻略,包括如何将Stream转换为byte[],以及如何将byte[]转换为Stream。同时,本文还将提供两个示例,以帮助读者更好地理解如何在C#中进行Stream和byte[]之间的转换。 将Stream转换为byt…

    C# 2023年5月15日
    00
  • .NET6打包部署到Windows Service的全过程

    以下是.NET 6打包部署到Windows Service的全过程攻略: 1. 什么是Windows Service Windows Service是一种在后台运行的应用程序,它可以在Windows操作系统启动时动启动,并在系统运行时一直运行。Windows Service通常用于执行后台任务,例如监视文件夹、处理消息队列等。 2. 什么是.NET 6 .N…

    C# 2023年5月12日
    00
  • C#实现将程序运行信息写入日志的方法

    针对C#实现将程序运行信息写入日志的方法,可以分为以下几个步骤: 1.引入日志框架 要实现将程序运行信息写入日志,我们需要引入一个日志框架(logging framework),比如log4net、NLog等。这些日志框架拥有强大的日志记录功能,能够对应用程序进行日志记录。 以使用log4net为例,在Visual Studio项目中引入log4net及其相…

    C# 2023年6月1日
    00
  • asp.net 打印控件使用方法

    标题:ASP.NET打印控件使用方法 在ASP.NET开发过程中,打印控件是一个非常重要的组件。他可以方便用户进行在线的打印。本文将详细讲解ASP.NET中打印控件的使用方法。 打印控件引用 要使用ASP.NET中的打印控件,需要在页面中引用”System.Drawing.dll”和”System.Drawing.Printing.dll”这两个命名空间。 …

    C# 2023年6月3日
    00
  • C#使用WebSocket与网页实时通信的实现示例

    首先,要使用WebSocket与网页实时通信,需要在C#时编写WebSocket服务端,并在网页中使用JavaScript编写WebSocket客户端。下面是实现该功能的完整攻略: C# WebSocket服务端 创建新项目。在Visual Studio里新建一个Class Library项目。 安装Newtonsoft.Json NuGet包。在项目中右击…

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