当前位置: 代码网 > it编程>编程语言>Asp.net > C#中的序列化与反序列化方式

C#中的序列化与反序列化方式

2024年12月17日 Asp.net 我要评论
前言在 c# 编程中,序列化和反序列化是非常重要的概念。序列化是将对象转换为可以存储或传输的格式的过程,而反序列化则是将存储或传输的格式转换回对象的过程。这两个过程在许多应用场景中都非常有用,例如保存

前言

在 c# 编程中,序列化和反序列化是非常重要的概念。

序列化是将对象转换为可以存储或传输的格式的过程,而反序列化则是将存储或传输的格式转换回对象的过程。

这两个过程在许多应用场景中都非常有用,例如保存对象状态、在网络上传输对象、在不同的应用程序之间共享数据等。

一、序列化的概念和目的

1. 概念

序列化是将对象的状态转换为可以存储或传输的格式的过程。

在 c# 中,可以使用多种方式进行序列化,例如使用二进制序列化、xml 序列化或 json 序列化等。

2. 目的

  • 数据存储: 将对象的状态保存到文件、数据库或其他存储介质中,以便在以后需要时可以重新加载并恢复对象的状态。
  • 网络传输: 将对象的状态通过网络发送到其他计算机或设备上,以便在接收端可以重新创建对象并恢复其状态。
  • 数据共享: 在不同的应用程序之间共享对象的状态,以便可以在不同的环境中使用相同的数据。

二、反序列化的概念和目的

1. 概念

反序列化是将存储或传输的格式转换回对象的过程。

在 c# 中,可以使用与序列化相同的方式进行反序列化,例如使用二进制序列化、xml 序列化或 json 序列化等。

2. 目的

  • 数据恢复: 从存储介质中读取序列化的数据,并将其转换回对象的状态,以便可以继续使用对象。
  • 网络接收: 接收通过网络发送的序列化数据,并将其转换回对象的状态,以便可以在本地处理对象。
  • 数据共享: 从其他应用程序接收到共享的序列化数据,并将其转换回对象的状态,以便可以在本地使用相同的数据。

三、c# 中的序列化方法

1. 二进制序列化

使用方法:使用binaryformatter类进行二进制序列化。

首先,需要在代码中引入system.runtime.serialization.formatters.binary命名空间。

然后,可以创建一个binaryformatter对象,并使用serialize方法将对象序列化为字节流,使用deserialize方法将字节流反序列化为对象。

using system.io;
using system.runtime.serialization.formatters.binary;

class program
{
    static void main()
    {
        // 创建一个要序列化的对象
        myclass obj = new myclass { name = "john", age = 30 };

        // 使用二进制序列化将对象序列化为字节流
        using (memorystream stream = new memorystream())
        {
            binaryformatter formatter = new binaryformatter();
            formatter.serialize(stream, obj);

            // 将字节流转换为字节数组
            byte[] data = stream.toarray();

            // 使用二进制反序列化将字节数组反序列化为对象
            using (memorystream stream2 = new memorystream(data))
            {
                binaryformatter formatter2 = new binaryformatter();
                myclass deserializedobj = (myclass)formatter2.deserialize(stream2);

                console.writeline(deserializedobj.name);
                console.writeline(deserializedobj.age);
            }
        }
    }
}

[serializable]
class myclass
{
    public string name { get; set; }
    public int age { get; set; }
}

特点:

  • 二进制序列化是一种高效的序列化方式,可以快速地将对象序列化为字节流,并在需要时快速地将字节流反序列化为对象。
  • 二进制序列化生成的字节流是紧凑的,占用的存储空间较小。
  • 二进制序列化是一种私有序列化方式,只有使用相同的程序集和类型定义才能进行反序列化。

2. xml 序列化

使用方法:使用xmlserializer类进行 xml 序列化。

首先,需要在代码中引入system.xml.serialization命名空间。

然后,可以创建一个xmlserializer对象,并使用serialize方法将对象序列化为 xml 文档,使用deserialize方法将 xml 文档反序列化为对象。

using system.io;
using system.xml.serialization;

class program
{
    static void main()
    {
        // 创建一个要序列化的对象
        myclass obj = new myclass { name = "john", age = 30 };

        // 使用 xml 序列化将对象序列化为 xml 文档
        using (stringwriter writer = new stringwriter())
        {
            xmlserializer serializer = new xmlserializer(typeof(myclass));
            serializer.serialize(writer, obj);

            string xml = writer.tostring();

            // 使用 xml 反序列化将 xml 文档反序列化为对象
            using (stringreader reader = new stringreader(xml))
            {
                xmlserializer serializer2 = new xmlserializer(typeof(myclass));
                myclass deserializedobj = (myclass)serializer2.deserialize(reader);

                console.writeline(deserializedobj.name);
                console.writeline(deserializedobj.age);
            }
        }
    }
}

[serializable]
[xmlroot("myclass")]
class myclass
{
    public string name { get; set; }
    public int age { get; set; }
}

特点:  

  • xml 序列化生成的 xml 文档是一种人类可读的格式,可以方便地进行查看和编辑。
  • xml 序列化是一种公开的序列化方式,可以在不同的平台和编程语言之间进行数据交换。
  • xml 序列化生成的 xml 文档通常比二进制序列化生成的字节流占用更多的存储空间。

3. json 序列化

使用方法:使用jsonserializer类进行 json 序列化。

首先,需要在代码中引入system.text.json命名空间。

然后,可以创建一个jsonserializeroptions对象,并设置序列化选项,例如缩进格式、属性名称大小写等。

最后,可以使用jsonserializer.serialize方法将对象序列化为 json 字符串,使用jsonserializer.deserialize方法将 json 字符串反序列化为对象。

using system.text.json;

class program
{
    static void main()
    {
        // 创建一个要序列化的对象
        myclass obj = new myclass { name = "john", age = 30 };

        // 使用 json 序列化将对象序列化为 json 字符串
        string json = jsonserializer.serialize(obj);

        // 使用 json 反序列化将 json 字符串反序列化为对象
        myclass deserializedobj = jsonserializer.deserialize<myclass>(json);

        console.writeline(deserializedobj.name);
        console.writeline(deserializedobj.age);
    }
}

class myclass
{
    public string name { get; set; }
    public int age { get; set; }
}

特点:

  • json 序列化生成的 json 字符串是一种轻量级的数据交换格式,占用的存储空间较小,并且易于在不同的平台和编程语言之间进行数据交换。
  • json 序列化是一种人类可读的格式,可以方便地进行查看和编辑。
  • json 序列化可以使用第三方库进行扩展,例如 newtonsoft.json,提供更多的功能和选项。

四、总结

序列化和反序列化是 c# 编程中非常重要的概念,可以方便地进行数据存储、网络传输和数据共享等操作。

在 c# 中,可以使用二进制序列化、xml 序列化和 json 序列化等方式进行序列化和反序列化。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com