【json序列化】json的序列化、二进制序列化、JSON传输二进制数据方法

 

 

  • 序列化: 将数据结构json字符串或对象转换成二进制串的过程
  • 反序列化:将在序列化过程中所生成的二进制串或者json字符串转换成数据结构或者对象的过程


 

1、JSON序列化 是将对象的属性以键值对的形式组织成字符串(一个编码过程),显然体积会增大很多。
而且解码后也不能直接还原回原来的对象


2、二进制序列化 是将对象的内存映射抽取出来形成字符串,还原时只有一个重新分配内存的过程。还原后依然还是你原来的对象

将二进制序列化后的串写入文件,就可以认为他是数据库中的一个表(专用的而已)
如果将你的对象细分成若干个子对象,分别对各子对象做二进制序列化,并以某种格式保存在同一个文件中。
再配上管理方法,那么你就已经实现了自己的 NOSQL 了

 

+如果序列化后的内容还是日后给自己用的,自然是二进制序列化较好
Soap、XML、json 序列化都是为了交换数据用的

+ 序列化写二进制文件跟直接用C写有什么区别?通常说的序列化是平台提供好的规范化的方法,直接用C相当于自己实现一遍。

 

JSON传输二进制数据方法:

http://www.cnblogs.com/WarBlog/p/4747155.html

 

json 传输二进制数组方案

json 是一种很简洁的协议,但可惜的是,它只能传递基本的数型(int,long,string等),但不能传递byte类型。如果想要传输图片等二进制文件的话,是没办法直接传输。

本文提供一种思路给大家参考,让大家可以在json传输二进制文件,如果大家有这个需求又不知怎么实现的话,也许本文能够帮到你。思想适用于所有语言,本文以java实现,相信大家很容易就能转化为自己懂得语言。

思路

1. 读取二进制文件到内存

2. 用Gzip压缩一下。毕竟是在网络传输嘛,当然你也可以不压缩。

3. 用Base64 把byte[] 转成字符串

补充:什么是Base64

Base64是一种编码方式,它可以将8位的非英语字符转化为7位的ASCII字符。这样的初衷,是为了满足电子邮件中不能直接使用非ASCII码字符的规定,但是也有其他重要的意义:

a)所有的二进制文件,都可以因此转化为可打印的文本编码,使用文本软件进行编辑;

b)能够对文本进行简单的加密。

实现

主要思路就是以上3步,把字符串添加到json字段后发给服务端,然后服务器再用Base64解密–>Gzip解压,就能得到原始的二进制文件了。是不是很简单呢?说了不少,下面我们来看看具体的代码实现。

***注:Java SE是没办法直接用Base64的哦,必须要先自己去下载一份。但Android已经集成了Base64,因此大家可以直接在Android使用。

 


public class TestBase64 {
 public static void main(String[] args) {
  byte[] data = compress(loadFile());

 String json = new String(Base64.encodeBase64(data));
  System.out.println("data length:" + json.length());
 }
 
 
 public static byte[] loadFile() {
  File file = new File("d:/11.jpg");

 FileInputStream fis = null;
  ByteArrayOutputStream baos = null;
  byte[] data = null ;

 try {
   fis = new FileInputStream(file);
   baos = new ByteArrayOutputStream((int) file.length());

 byte[] buffer = new byte[1024];
   int len = -1;
   while ((len = fis.read(buffer)) != -1) {
    baos.write(buffer, 0, len);
   }
   
   data = baos.toByteArray() ;

 } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    if (fis != null) {
     fis.close();
     fis = null;
    }
    
    baos.close() ;
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  
  return data ;
 }
 
 
 public static byte[] compress(byte[] data) {
  System.out.println("before:" + data.length);
  
  GZIPOutputStream gzip = null ;
  ByteArrayOutputStream baos = null ;
  byte[] newData = null ;
  
  try {
   baos = new ByteArrayOutputStream() ;
   gzip = new GZIPOutputStream(baos);
   
   gzip.write(data);
   gzip.finish();
   gzip.flush();
   
   newData = baos.toByteArray() ;
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    gzip.close();
    baos.close() ;
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  
  System.out.println("after:" + newData.length);
  return newData ;
 }
}

posted on 2022-10-04 01:29  bdy  阅读(1946)  评论(0编辑  收藏  举报

导航