当前位置: 首页 > news >正文

10-序列化

本篇博客对应视频讲解

回顾

在上一篇文章中,我们演示了如何使用异步实现多线程批量下载图片。 我们没有过多讲解线程Thread类,是因为在我们实际使用中,我们常用的需求,使用异步就能很好的解决,也不容易出错。 但我仍然建议大家阅读官方文档,以了解线程相关的内容。

序列化

我们知道,面向对象,我们把现实事物都抽象成对象,在编程语言中,使用类去定义它。但类或对象只是抽象的概念,我们在数据传递过程中,并不能直接传递这些抽象的东西。归根结底还是传递字节流。那么所谓序列化,其目的就是将对象转换为可传递数据的过程。 当然从数据转化为对象,自然就叫反序列化了。

关于序列化的概念及作用,务必阅读官方文档解释。

今天我们就了解一下,在序列化中最常使用的两种格式,XML与JSON。

XML

我们会演示一些最常用的操作,而关于更详尽的内容,我也整理给大家。

  1. 创建XML文档。

我们可以使用XElement 或XDocument去生成和操作XML。但通常情况下我们更关注如何将现在对象转换成XML,以及如何将XML转换成对象。 以下例子: 先定义Course与Blog类.

    /// <summary>
    /// 课程类
    /// </summary>
    public class Course
    {
        /// <summary>
        /// 课程名称
        /// </summary>
        public string Name { get; set; }

        //[XmlElement(ElementName="Blog")]
        //[XmlArray("BlogList")]
        public Blog[] Blogs { get; set; }
    }

    /// <summary>
    /// 博文
    /// </summary>
    public class Blog
    {
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        /// 内容
        /// </summary>
        //[XmlIgnore]
        public string Content { get; set; }

        /// <summary>
        /// 作者
        /// </summary>
        [XmlAttribute(AttributeName = "author")]
        public string Author { get; set; } = "NilTor";
    }

序列化与反序列化

    // 创建对象
    var course = new Course()
    {
        Name = "C#快速入门",
        Blogs = new Blog[]
        {
            new Blog
            {
                Title= "序列化",
                Content = "C#序列化内容"
            },
            new Blog
            {
                Title="Linq",
                Content= "如何使用Linq"
            }
        }
    };

    // 序列化,object->xml
    var ser = new XmlSerializer(typeof(Course));
    var writer = new StringWriter();
    ser.Serialize(writer, course);
    File.WriteAllText("course.xml", writer.ToString(), Encoding.Unicode);

    // 反序列化,xml->object
    var fileStream = new FileStream("course.xml", FileMode.Open);
    var course1 = ser.Deserialize(fileStream);

    Console.ReadLine();

JSON

json序列化应该说在Web开发中是再常见不过的了。在.Net中,我们可以使用DataContractJsonSerializer类进行序列化与反序列化,使用方法与XmlSerializer非常相似,只是需要先定义数据协定,也就是在类与成员加上DataContractDataMember特性。

使用DataContractJsonSerializer

参考官方的例子:

    [DataContract]
    internal class Person
    {
        [DataMember]
        internal string name;

        [DataMember]
        internal int age;
    }

	Person p = new Person();
	p.name = "John";
	p.age = 42;

	// 序列化
	MemoryStream stream1 = new MemoryStream();
	DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
	ser.WriteObject(stream1, p);
	stream1.Position = 0;
	StreamReader sr = new StreamReader(stream1);
	Console.Write("JSON form of Person object: ");
	Console.WriteLine(sr.ReadToEnd());

	// 反序列化
	stream1.Position = 0;
	Person p2 = (Person)ser.ReadObject(stream1);

不难发现,无论是Json还是Xml,我们进行(反)序列化操作都是通过流(stream),所谓流,只是一种形象的表述,表示处于一种"流"的状态,里面的内容(一个个字节)并不代表任何含义。stream只是实现了一系列接口,这些接口能对字节进行相关的操作。有点类似String与StringBuilder。 说到底,无论是字符编码,还是序列化,我们都要先将内容"解析"到字节的层面,然后再进行相关的转化操作。

使用Newtonsoft.Json

这是一个第三方类库,但却是最流行,最常用的类库,其功能相当丰富,使用起来也更加方便实用。所以,通常我们需要进行Json的(反)序列化时,会建议使用该库类进行相关的操作。 以下是示例代码:

// 序列化,object->json
var json = JsonConvert.SerializeObject(course);
Console.WriteLine(json);
// 反序列化,json->object
var course2 = JsonConvert.DeserializeObject<Course>(json);

我们可以看到,使用起来要简洁的多,推荐大家使用。

解析

序列化和解析还不是一个概念。序列化更具体一些,作用上文我们也提到了。而解析的概念是对目标进行分析,了解其含义。举个简单的例子,我们有一个XML或JSON文件,里面有我们需要的数据,我们通过一些方式把我们想要的数据获取到,这个过程就可以称之为解析。我们可以使用正则,可以使用linq,也可以使用序列化的方式对源数据进行转化或查询,最终得到我们要的内容。

也就是说,序列化是我们解析目标数据的一种方式,也可以说是常用的方式,但二者并不是一个概念。

转载于:https://www.cnblogs.com/msdeveloper/p/9773857.html

相关文章:

  • EM算法
  • 《弹球学成语》需求分析报告
  • IDEA控制台问题:java lang OutOfMemoryError:PermGen space
  • c语言打印空白星号矩形
  • 关于Qt中窗口的坐标
  • Django将默认的SQLite更换为MySQL
  • Django的contenttypes
  • 离散傅里叶级数DFS
  • NiftyNet开源平台的使用 -- 配置文件
  • 构造代块 的作用
  • [SCOI2010]传送带
  • 2018.10.17多校
  • [USACO16FEB]负载平衡Load Balancing_Silver(NlogNlogN解法)
  • 在Ubuntu上学习OpenStack之五:控制节点上安装Nova
  • LintCode: coins in a line I
  • 【个人向】《HTTP图解》阅后小结
  • Angular Elements 及其运作原理
  • fetch 从初识到应用
  • GitUp, 你不可错过的秀外慧中的git工具
  • jdbc就是这么简单
  • Linux后台研发超实用命令总结
  • log4j2输出到kafka
  • Node + FFmpeg 实现Canvas动画导出视频
  • node入门
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Vue2.0 实现互斥
  • zookeeper系列(七)实战分布式命名服务
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 解析带emoji和链接的聊天系统消息
  • 双管齐下,VMware的容器新战略
  • 线性表及其算法(java实现)
  • 云大使推广中的常见热门问题
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #if和#ifdef区别
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (+4)2.2UML建模图
  • (12)Linux 常见的三种进程状态
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (ZT)薛涌:谈贫说富
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (算法)前K大的和
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • ./和../以及/和~之间的区别
  • .net core使用ef 6
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • :中兴通讯为何成功
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600