zoukankan      html  css  js  c++  java
  • 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的都是些非常少用的文字符号。

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

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

  • 相关阅读:
    zookeeper 分布式锁
    mysql linux 安装
    分布式配置中心Apollo
    分布式任务调度平台xxl-job
    Java并发编程笔记之ThreadLocalRandom源码分析
    Java并发编程笔记之ThreadLocal源码分析
    SpringCloud实战10-Sleuth
    SpringCloud实战9-Stream消息驱动
    SpringCloud实战8-Bus消息总线
    SpringCloud实战7-Config分布式配置管理
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/1515755.html
Copyright © 2011-2022 走看看