测试同学需要了解的序列化和反序列化
乙醇 创建于 8 months 之前
最后更新: less than a minute 之前
阅读数: 455
经常看到有同学弄不清楚序列化和反序列化,从而造成了很多困扰。
从工作上的现实意义来说,了解序列化和反序列化是相当有必要的,在一些场景下可以指导测试用例的编写,另外也可以帮助我们了解被测产品/项目的一些实现细节。
定义
序列化(Serialization)
In computer science, in the context of data storage, serialization (or serialisation) is the process of translating data structures or object state into a format that can be stored (for example, in a file or memory buffer) or transmitted (for example, across a network connection link) and reconstructed later (possibly in a different computer environment).
简单来说,序列化是一个过程,是把一些数据结构或对象转换成是可以存储(比如保存到文件,内存,数据库)或者是可以传输(比如网络传输)的格式。当然,这个格式的数据是可以反过来还原成数据结构或对象的。
是不是有点绕?举个具体的例子。
For an everyday example, say you want to tell your friend over the phone about your puppy. You are not able to send the entire living dog over the phone, but are restricted to describe the dog in a format that can be conveyed over the phone, in a serialized form: You say "It's black, small, 5 months old..." Your friend will then deserialize the information into a form that is feasible on his side: a mental image of the black, little dog. Likewise, a computer program cannot just send its compiled objects to another computer - objects from a Windows compiler won't do on MacOS for instance. Instead it serializes the object MyPuppy to an XML or JSON string ({"color":"black", "size":"small"...}) that can be sent and easily interpreted, or deserialized, into another system's dog object as a black, little puppy.
上面的例子来自维基百科,英文好的同学可以自己做阅读理解。
如果你想把你的宠物狗通过手机发送给你朋友,很显然,狗狗是不可能通过网络传输的,那么你怎么在不发送照片的情况下告诉你朋友关于你狗狗的情况呢?你可以把狗狗的描述发给他,比如这只"狗是黑色的,小型的5个月大的泰迪犬"。朋友看到了这个描述后,可以大致反解和还原出这只狗狗的情况吧。同样的,计算机编程语言是不能把一些复杂的对象发送给其他的计算机的,比如windows上的对象就不能直接发送给macos电脑。不过我们可以把这些对象通过XML或者JSON String的方式——比如狗狗这个对象,({"color":"black", "size":"small"...})——进行发送和传输。
还是不理解?那么就先简单记住,序列化就是把编程语言里的对象转换成是字符串(实际上不是字符串,而是字节流,不过初学者可以简单这么无脑理解)。
反序列化(Deserialization)
有了序列化的定义,反序列化就好理解了。
一句话描述反序列化就是把字符串(实际上是字节流)还原成计算机语言中的对象的过程。
JSON
对很多同学来说,json是最熟悉的陌生人,经常听经常用,可是却搞不清楚一些核心的原理。
json的定义是SON(JavaScript Object Notation,JavaScript对象表示法,读作/ˈdʒeɪsən/)是一种由道格拉斯·克罗克福特构想和设计、轻量级的数据交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。
所以json的本质是字符串,是一种特定格式的字符串。
发post请求时候将json发到服务器的意思就是把json格式的字符串发送到服务器。
json尽管是来自于js,但当前很多编程语言都支持 JSON 格式数据的生成和解析。
以python为例
dict -> JSON 字符串: 序列化
JSON字符串 -> dict: 反序列化
把json字符串还原成python字典的过程,叫做反序列化;
把python字典转换成json字符串的过程,叫做序列化;
python字典是python编程语言中的一种数据结构,因而满足我们刚才的定义:序列化就是把编程语言里的对象转换成是字符串。
XML
大家可以把xml当成json来看待,xml也是字符串,是有格式的字符串,可以把编程语言中的对象序列化成xml,也可以把xml反序列化成编程语言中的对象。
Protocol Buffers
很多同学把PB当成是加密解密的方式,这实际上是不正确的。
PB其实也是序列化和反序列化。
官方定义如下:
Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages.
大家可以无脑把pb看作xml,只是pb序列化成的结果并不像xml那样的具有可读性,因为pb序列化后的结构是字节流,不是字符串,一般的人类是读不懂字节流的。
可能是因为读不懂,所以才把pb当成是加密解密了吧。
PB的例子。
# 定义数据结构
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
}
# 序列化
Person john = Person.newBuilder()
.setId(1234)
.setName("John Doe")
.setEmail("jdoe@example.com")
.build();
output = new FileOutputStream(args[0]);
john.writeTo(output);
# 反序列化
Person john;
fstream input(argv[1],
ios::in | ios::binary);
john.ParseFromIstream(&input);
id = john.id();
name = john.name();
email = john.email();
总结
- 把对象变成字符串的过程是?
- 把字符串还原成对象的过程是?
- pb是不是加密解密的方式?
- json是字符串还是对象?