C#序列化和转码

首先 我们写两个代码

1.byte[] q=  System.Text.Encoding.UTF8.GetBytes("哈");

2.
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, "哈");
stream.Close();
byte[] qq=stream.ToArray();

第一个方法是把"哈"字符串转换成UTF8码,第二个是序列化"哈"

不同之处在于

一.

1是单纯的转码

2是序列化"哈"这个字符串对象,一个对象包括很对内容(属性,方法,索引器等等)

序列化对象就是把对象变成byte[]的格式,因为对象的成员很复杂,而且类型不同,所以变起来没有转码那么简单

二.

我们会发现,2并没有指定编码格式,难道序列化就不需要指定编码格式吗,那当然是不可能的,通过我实验当序列化对象时,把对象中数据成员的字符串转化为byte[]是按照UTF8码来做的,其它类型我没有实验

 

那为什么要用UTF8而不用Unicode?

看一下 下面的解释

 UTF8效率
  1.每个英文字母、数字所占的空间为1 Byte;
  2.泛欧语系、斯拉夫语字母占2 Bytes;
  3.汉字占3 Bytes。
用Unicode的话,英文也变成2 Bytes了
原来老美是为了照顾自己 而损失了汉语的效率,明白了了吧

由此可见UTF8对英文来说是个非常诱人的方案,但对中文来说则不太合算,无论用ANSI还是 Unicode/UCS2来编码都只用2 Bytes,但用UTF8则需要3 Bytes。
  以下是一些统计资料,显示用UTF8来储存文件每个字符所需的平均字节:
  1.拉丁语系平均用1.1 Bytes;
  2.希腊文、俄文、阿拉伯文和希伯莱文平均用1.7 Bytes;
  3.其他大部份文字如中文、日文、韩文、Hindi(北印度语)用约3 Bytes;
  4.用超过4 Bytes的都是些非常少用的文字符号。

一开始我用序列化的时候,我就很奇怪,为什么不用指定编码,原来不是没指定,而是序列化对象自身已经做好了算法,(有可能针对不同类型用了很多不同的编码,自定义很复杂,失去了意义,系统指定的最优化编码)并没有提供给外接指定编码的接口(可以自定义序列化,但不知道可不可以自定义序列化编码)

一家之言,不敢肯定是正确的,作为参考吧

原文地址:https://www.cnblogs.com/cuihongyu3503319/p/1515755.html