二进制序列化与反序列化。Net理论篇上(一)

对于从事底层信息通信的同行而言,序列化及反序列化想必都是耳熟能详的。脱离很多书面的标准概念,就个人理解而言,序列化和反序列化的本质其实为了找到一种公共的通用的数据格式达到一个无界的境界,正如方言对于普通话,各国语言对于英语。而我们需要做的是去发现这么一种具体的格式,并且完成一个相对对称的特性,如同压缩跟解压缩。

常规的序列化和反序列化的格式通常有如下几种:binary,JSON, XML和SOAP等。 当然有其他的,这个只能恕我孤陋寡闻了。通常我们会选取短小精悍的JSON 和更具通用的XML,当然很多同行也会采用SOAP。我也多会采用JSON,毕竟Newtonsoft.JSON的强悍还是不言而喻的,(对于阿里的fastjson,我只能深表同情,哥知道不是你们的错,这是后话)。唯独不常见binary的身影,让我深感诧异,也许是我阅历不深,特此反省。不过,很多通信底层例如socket亦或之上的TCP或者UDP,都才用binary作为通信的基础格式,不否认可以借助其他的方式去取得binary的数据。但是如有更加通用直接的binary序列化和反序列化类库或者架包不是显得更好。所以下定决心做一个自己的binary序列化和反序列化的类库,当然出于工作的需要,对于代码现在不方便贴出来,出于职业的操守,所以暂时深感抱歉。先跟各位分享下自己的架设和期间遇到的问题,当然有合适的时间,我还是希望这个能成为开源的一部分,也是我希望接下去要做的事。

在之前,我必须得承认这个并不具有原创性,很多设计原理的灵感来源于同类软件的设计,毕竟站在巨人肩上才能看得更远。所以之前,我会拿Newtonsoft.JSON举例,也是我目前用得相对比较多的软件,当然这个近似万能的类库也有很多自己的限制,例如对其中不支持byte[]的序列化和反序列化就深感奇怪,不知道这是出于怎样的心理和考虑,大概是觉得很多人会把string再转成byte带来的重复转化的愧疚,这也成为我想做自己的binary序列化类库的其中的一个出发点。当然,还是先看看它是怎么做得。

JsonConvert是Newtonsoft.JSON的入口,通过源码分析,你确实会发现在这个如同生态园的入口之后是个多么丰富的世界,当你领略完之后你在回头看这个入口,你会再次发现这个入口确实恰如其分,妙到豪颠。也许略有夸张,在我看来这个一个经典的门面模式的应用,而这个应用确实非常有用。

还是先看看它是怎么工作的。首先当我们使用JsonConvert. SerializeObject(object)时,它首先创建临时的StringBuilder的临时数据池,其目的我不在累诉。并且同时构建一个数据写入器JsonWriter负责对转化后的字符串片段的有序写入,这里强调有序写入,因为这个很讲究,这也是Newtonsoft.JSON没有采用并发读写其中一个相对重要的原因,当然更重要的可能是并发读写的不可控。在做完准备工作之后,它需要对object进行描述就如同文件描述一样,生成相应的JsonContract 以方便去控制后续的编码转化行为。真正完成各种类型转化的是编码转化层。根据JsonContract,Newtonsoft.JSON能够识别需要用何种JsonConverter去处理。当找到具体的JsonConverter时候就可以借助它将目标转化为string通过JsonWriter写入到数据池中。对于反序列化亦然,只是过程逆转而已。

这里需要抓住几个关键点以及难点,首先如何定义JasnContract,这个类在我看来是整个类库的核心部件,看似无关紧要,但实际却是举足轻重,因为真正的调度其实是由它做出的。 第二需要找到各种基本类型对应转化到通用类型的途径,第三点就是找到自定义类型转化的方式方法。

下一张应该是为具体自定义二进制序列化和反序列化的设计。

二进制序列化与反序列化。Net理论篇上(一),布布扣,bubuko.com

时间: 2024-10-10 13:10:08

二进制序列化与反序列化。Net理论篇上(一)的相关文章

Unity使用protobuf-net进行二进制序列化与反序列化

Protobuf-net提供的一种易于使用的数据序列化方案,可序列化带有[ProtoContract]特性的类实例,并可支持Unity各个发布平台,且效率高.易用性强. 1 public static class Serialization 2 { 3 public static byte[] Serialize<T>(T instance) 4 { 5 byte[] bytes; 6 using (var ms = new MemoryStream()) 7 { 8 Serializer.S

深入认识二进制序列化--记一次生产事故的思考

一 概要 二进制序列化是公司内部自研微服务框架的主要的数据传输处理方式,但是普通的开发人员对于二进制的学习和了解并不深入,容易导致使用过程中出现了问题却没有分析解决的思路.本文从一次生产环境的事故引入这个话题,通过对于事故的分析过程,探讨了平时没有关注到的一些技术要点.二进制序列化结果并不像Json序列化一样具备良好的可读性,对于序列化的结果大多数人并不了解,因此本文最后通过实际的例子,对照MSDN的文档对于序列化结果进行详细解析,并意图通过本次分析对于二进制序列化的结果有直观和深入的认识. 二

C#对象序列化与反序列化

1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下. SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的.

12.C#对象序列化与反序列化

1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下. SOAP序列化:  对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的

42. C# -- 序列化和反序列化

1. 对象序列化的介绍 (1) .NET支持对象序列化的几种方式 (2) 几种序列化的区别 (3) 使用特性对序列化的控制 2. 使用二进制序列化和反序列化 (1) 二进制序列化与反序列化的程序示例 (2) 总结 3. 使用SOAP方式序列化和反序列化 (1) SOAP序列化与反序列化的程序示例 (2) 总结 4. 使用XML方式序列化和反序列化 (1) XML序列化与反序列化的程序示例 (2) 总结 5. XML序列化对象详解 (1) 说明 (2) 使用XmlElement(默认值) (3) 

C#序列化与反序列化学习

最近为了换一份新工作,准备了不少笔试题.从笔试当中自己发现了不少基础知识的盲点.很庆幸这样的机会,可以让自己对于基础知识的理解又上升一个台阶.此文介绍C#里面的序列化与反序列化的知识,如果你是大鸟,请口下留情. 首先,什么是序列化与反序列化呢? 序列化就是将对象的状态信息转换为可以存储或传输形式的过程.其实就是将对象持久化,比如说把对象保存为二进制或者是XML的方式.可以将对象序列到流.磁盘.内存和网络等等.相反,反序列化则是将存储或传输形式转换为对象的过程. 那么,运用序列化的好处又是什么呢?

序列化与反序列化 - BinaryFormatter二进制(.dat)、SoapFormatter(.soap)、XmlSerializer(.xml)

序列化的作用是什么?为什么要序列化? 1.在进程下次启动时读取上次保存的对象的信息. 2.在不同的应用程序域或进程之间传递数据. 3.在分布式应用程序中的各应用程序之间传输对象. 所为序列化,就是将对象先转换为一种适当格式,然后再将其传输到目标位置的过程. 所为适当格式,有时候需要是二进制格式,有时候需要SOAP格式或者其他的XML,JSON格式等,也可以使应用程序所特有的.定制化的格式.因此,可以将序列化视为将对象的状态保存到流或缓冲区的方法,和序列化相反的就是烦序列化,就是把对象或数据从序列

C# 二进制、Xml、Json序列化和反序列化

昨天利用业余时间对比了下C#中三种序列化方式(二进制.Xml.Json),综合来看json方式生成的字节数组长度最短,但当你需要序列化的对象中包括byte[]类型,且其长度较长时,序列化后,xml方式的长度较json方式更短.xml方式中对byte[]做了base64转换. 最后综合三种情况,写了一个基于泛型的通用类来完成序列化和反序列化操作,仅供参考,若有什么错误之处,还请指教. using System; using System.Collections.Generic; using Sys

第85篇 Vue第六篇 Rest_Framework序列化与反序列化 Serializers

models.py from django.db import models # Create your models here. __all__ = ["Book", "Publisher", "Author"] class Book(models.Model): title = models.CharField(max_length=32) CHOICES = ((1, "python"), (2, "linux