0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C#实现对象序列化的三种方式是什么

汽车电子技术 来源: dotNet工控上位机 作者:新阁教育付工 2023-02-22 16:11 次阅读

Begin-

前言

最近有一些学员问到了一些关于序列化的问题,今天这篇文章,跟大家分享一下在C#开发中,常用的三种序列化的方式。

很多小伙伴一提到序列化,都会想到二进制序列化,但其实序列化并不仅仅只是二进制序列化,我们常说的对象序列化有三种方式,分别是二进制序列化、XML序列化及JSON序列化,这三种方式各有各自的优势和不足,实际应用中,大家自己根据实际情况,选择适合的。

准备

在实现之前,先要做一些准备工作,序列化其实是对象和字符串(文件)之间的互相转换,所以首先我们准备好一个实体类,很简单的Student类:

public class Student
    {
        public int StudentId { get; set; }

        public string StudentName { get; set; }

        public string ClassName { get; set; }

        public override string ToString()
        {
            return StudentId + ";" + StudentName + ";" + ClassName;
        }
    }

这里我重写了ToString方法,便于后续测试时,直观地看到对象的值是否正确。

同时我们准备好一个Student对象,后面就一直要对它进行操作了。

class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student()
            {
                StudentId = 10001,
                StudentName = "小华",
                ClassName = "软件一班"
            };
        } 
    }

二进制

二进制序列化及反序列化的方式主要是使用BinaryFormatter这个类,序列化代码如下:

BinaryFormatter serializer = new BinaryFormatter();

    MemoryStream memStream = new MemoryStream();

    serializer.Serialize(memStream, student);

    memStream.Close();

    string info = Encoding.Unicode.GetString(memStream.ToArray());

    Console.WriteLine("二进制序列化结果:");

    Console.WriteLine(Environment.NewLine);

    Console.WriteLine(info);

    Console.WriteLine(Environment.NewLine);

反序列化代码如下:

memStream = new MemoryStream(Encoding.Unicode.GetBytes(info));

    student = (Student)serializer.Deserialize(memStream);

    memStream.Close();

    Console.WriteLine("二进制反序列化结果:");

    Console.WriteLine(Environment.NewLine);

    Console.WriteLine(student.ToString());

    Console.WriteLine(Environment.NewLine);

最终执行结果如下:

图片

我们可以看到二进制序列化的结果是一串乱码,但是我们可以通过反序列化的方式,拿到转换之后的结果。

这种方式使用起来比较简单,甚至还有加密的作用,但是也有一些不足:

  • 类名上面要加上[Serializable],不加无法序列化
[Serializable]
    public class Student
    {
        public int StudentId { get; set; }

        public string StudentName { get; set; }

        public string ClassName { get; set; }

        public override string ToString()
        {
            return StudentId + ";" + StudentName + ";" + ClassName;
        }
    }
  • 序列化的结果非常大,使用System.Text.Encoding.UTF8.GetString(bytes)查看下,发现数据量很大。
  • 序列化对象需要完全一致,连命名空间都要相同。

XML

XML序列化可提高可读性,以及对象共享和使用的灵活性,XML序列化将对象的公共字段和属性或方法的参数和返回值序列化成符合特定XML格式的流。

XML序列化代码如下:

XmlWriterSettings xmlSettings = new XmlWriterSettings();
    xmlSettings.OmitXmlDeclaration = true;
    xmlSettings.Encoding = new System.Text.UTF8Encoding(false);
    MemoryStream stream = new MemoryStream();
    XmlWriter xmlwriter = XmlWriter.Create(stream, xmlSettings); 
    XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
    xmlns.Add(String.Empty, String.Empty); 
    XmlSerializer ser = new XmlSerializer(typeof(Student));
    ser.Serialize(xmlwriter, student, xmlns);

    string info = Encoding.UTF8.GetString(stream.ToArray());

    Console.WriteLine("XML序列化结果:");
    Console.WriteLine(Environment.NewLine);
    Console.WriteLine(info);
    Console.WriteLine(Environment.NewLine);

XML反序列化代码如下:

XmlReader xmlReader = XmlReader.Create(new StringReader(info), new XmlReaderSettings());
    student = (Student)new XmlSerializer(typeof(Student)).Deserialize(xmlReader);

    Console.WriteLine("XML反序列化结果:");
    Console.WriteLine(Environment.NewLine);
    Console.WriteLine(student.ToString());
    Console.WriteLine(Environment.NewLine);

最终执行结果如下:

图片

我们可以直观地看到XML序列化的结果,可读性增强了很多,但是XML有它自身的不足之处。

JSON

JSON序列化是目前使用很多的一种方式,实现JSON序列化的方式也有很多,我一般会使用NewSoft.Json这个库来做,可以通过Nuget搜索安装。

JSON序列化代码如下:

string info = JsonConvert.SerializeObject(student);
    Console.WriteLine("JSON序列化结果:" + Environment.NewLine);
    Console.WriteLine(info);
    Console.WriteLine(Environment.NewLine);

JSON反序列化代码如下:

student = (Student)JsonConvert.DeserializeObject(info, typeof(Student));
    Console.WriteLine("JSON反序列化结果:");
    Console.WriteLine(Environment.NewLine);
    Console.WriteLine(student.ToString());
    Console.WriteLine(Environment.NewLine);

最终执行结果如下:

图片

我们可以看到JSON的方式除了可读性增强之外,结果也更加简洁。

-END-

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二进制
    +关注

    关注

    2

    文章

    708

    浏览量

    41254
  • XML
    XML
    +关注

    关注

    0

    文章

    183

    浏览量

    32936
  • JSON
    +关注

    关注

    0

    文章

    111

    浏览量

    6819
收藏 人收藏

    评论

    相关推荐

    如何使用Serde进行序列化和反序列化

    Serde 是一个用于序列化和反序列化 Rust 数据结构的库。它支持 JSON、BSON、YAML 等多种格式,并且可以自定义序列化和反序列化方式
    的头像 发表于 09-30 17:09 871次阅读

    序列化哈希表到文件

    BinarySerialize {//把哈希表对象序列化到文件public static void Serialize(String strFile, Hashtable ht){using
    发表于 06-18 18:28

    怎么支持PIC32中的JSON解析和序列化

    我正在寻找支持或库,允许我将JSON对象序列化为char数组,并将char数组/字符串解析为JSON对象。我查看了JSMN库,但它看起来只是解析,而不是序列化。我目前在ARDUINO板
    发表于 11-28 16:46

    Java序列化的机制和原理

    。SerialTest类实现了Parent超类,内部还持有一个Container对象序列化后的格式如下:AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C
    发表于 07-10 07:27

    c语言序列化和反序列化有何区别

    这里写自定义目录标题c语言序列化和反序列化tplut.htplut.c测试代码参考c语言序列化
    发表于 07-14 07:32

    关于c语言序列化和反序列化的知识点看完你就懂了

    关于c语言序列和反序列化的知识点你就懂了
    发表于 10-15 08:47

    SpringMVC JSON框架的自定义序列化与反序列化

    限于createTime和updateTime,更贴近于需求缺点就是需要转换的字段都需要使用注解,工作量有点大当然有其他的统一处理方案,这里不赘述。自定义反序列化在jackson框架上实现自定义序列化
    发表于 10-10 16:02

    java序列化和反序列化范例和JDK类库中的序列化API

    一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象序列化。 把字节
    发表于 09-27 10:13 6次下载

    java序列化的几种方式

    一.Java序列化的作用 有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从一个字节流中恢复一个Java对象。例如,有的时候我们想要 把一个Java对象写入到
    发表于 09-27 11:15 0次下载

    分享一个最新的的Python对象序列化方式

    。 谁应该都见过这个: 虽然这不是什么大问题。json模块(API继承自simplejson)提供了两种方式序列化对象: 1. 实现一个default()函数,它接收一个
    的头像 发表于 09-01 15:19 2457次阅读
    分享一个最新的的Python<b class='flag-5'>对象</b><b class='flag-5'>序列化</b><b class='flag-5'>方式</b>

    python序列化对象

    序列化对象:将对象转换为可以存储或传输的形式。 (1) 用于存储:将对象的字节序列存储到文件中,程序退出后不会消失,便于后续使用。
    的头像 发表于 03-10 09:57 2158次阅读

    python序列化对象

    序列化对象:将对象转换为可以存储或传输的形式。 (1) 用于存储:将对象的字节序列存储到文件中,程序退出后不会消失,便于后续使用。
    的头像 发表于 04-06 15:08 492次阅读

    什么是序列化 为什么要序列化

    什么是序列化? “序列化”(Serialization )的意思是将一个对象转化为字节流。 这里说的对象可以理解为“面向对象”里的那个
    的头像 发表于 09-14 17:22 1546次阅读
    什么是<b class='flag-5'>序列化</b> 为什么要<b class='flag-5'>序列化</b>

    Java序列化怎么使用

    转换方式就叫做序列化。将文件或者网络传输中得到的 byte[] 数组转换为 java 对象就叫做反序列化。 怎么使用 如果一个 Java 对象
    的头像 发表于 10-10 14:19 246次阅读

    什么时候需要Boost序列化

    程序开发中,序列化是经常需要用到的。像一些相对高级语言,比如JAVA, C#都已经很好的支持了序列化,那么C++呢?当然一个比较好的选择就是用Boost,这个号称C++准标准库的东西。 什么时候需要
    的头像 发表于 11-10 10:14 201次阅读