Python12_关于文件概念的讨论与序列化

文件是什么?
  存储在一些设备上的信息的集合。一堆字节;
====================================================
到底什么是二进制文件、和文本文件,它们有什么区别?

  首先文件无非就是一堆二进制数的集合;八个二进制成一个字节,也就是一堆字节的集合;

  文本文件就是基于字符编码的文件;

  二进制文件基于值编码的文件;

  文本文件和二进制文件的区别不是物理上的,而是逻辑上的;二者是在编码层上有差异;//二进制文件和文本文件是逻辑上的差异。编码层的差异

  文本文件基本上是定长编码

  而二进制文件可以看成是变长编码,多少个比特代表一个值,完全由你决定;完全基于具体应用,指定某个值代表什么意思,用户一般不能直接读懂它,要借助软件才行;

  以上是定义上的区别

====================================================

接下来讨论一下存储上的区别

 文本工具打开一个文件,首先读取文件物理上所对应的二进制比特流,然后按照所选择的解码方式来解释这个流,然后将解释结果显示出来。

 一般来说,你选取的解码方式会是ASCII码形式(ASCII码的一个字符是8个比特),接下来,它8个比特8个比特地来解释这个文件流。

 记事本无论打开什么文件都按既定的字符编码工作(如ASCII码),所以当他打开二进制文件时,出现乱码也是很必然的一件事情了,解码和译码不对应。

 文本文件的存储与其读取基本上是个逆过程。

 而二进制文件的存取与文本文件的存取差不多,只是编/解码方式不同而已。

 二进制文件就是把内存中的数据按其在内存中存储的形式原样输出到磁盘中存放,即存放的是数据的原形式。

    文本文件是把数据的终端形式的二进制数据输出到磁盘上存放,即存放的是数据的终端形式。

====================================================

使用二进制文件模式的时候,程序将数据从内存传输给文件时,将不会发生任何隐藏的转换

但是文本模式确并不是这样:

  对于Windows系统来说,它们使用两个字符的组合(回车和换行)表示换行符;

  对于Macintosh文本来说,使用回车来表示换行符;

  对于UNIX和Linux文件来说,使用换行符来表示换行符;

  C++由于是从Linux继承过来的,也使用换行符表示换行;

为了增加可移植性,Windows在写文本模式文件时,自动将C++换行符替换为回车和换行;->对文本做了改动;如果放到Linux下运行时,就会出问题;

====================================================

序列化和反序列化:

把对象转换为字节序列的过程称为对象的序列化把字节序列恢复为对象的过程称为对象的反序列化

对象的序列化主要有两种用途

1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

2) 在网络上传送对象的字节序列。

在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

我们说的序列化和反序列化是对JAVA而言(其他面向对象语言可能也有)的,序列化的实体是个对象,结果也是个对象,并非是格式化文本。

对象序列化的优点在哪里?网络传输方面的便捷性、灵活性就不说了,这里举个我们常常可能发生的需求:你有一个数据结构,里面存储的数据是经过非常多其他数据通过非常复杂的算法生成的,因为数据量非常大,算法又复杂,因此生成该数据结构所用数据的时间可能要非常久(或许几个小时,甚至几天),生成该数据结构后又要用作其他的计算,那么你在调试阶段,每次执行个程序,就光生成数据结构就要花上这么长的时间,无疑代价是非常大的。假设你确定生成数据结构的算法不会变或不常变,那么就能够通过序列化技术生成数据结构数据存储到磁盘上,下次又一次执行程序时仅仅须要从磁盘上读取该对象数据就可以,所花费时间也就读一个文件的时间,可想而知是多么的快,节省了我们的开发时间。

====================================================

参考链接:

序列化和反序列化的简单理解:https://www.cnblogs.com/lqmblog/p/8530108.html

C++序列化和反序列化:https://www.cnblogs.com/Malphite/p/10818954.html

原文地址:https://www.cnblogs.com/grooovvve/p/11167280.html