当前位置:编程学习 > JAVA >>

基于base64的GSON的数据压缩

在客户端和服务端交互使用JSON的时候,有byte[]类型的数据时候,JSON字符串会成倍增长,每个字节都会转变成0x..的字符串 ,增加了数据交互的文件传输量。


/*
 * GOSN常用类
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */ 
package org.brtx.tools; 
 
import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.JsonDeserializationContext; 
import com.google.gson.JsonDeserializer; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonParseException; 
import com.google.gson.JsonPrimitive; 
import com.google.gson.JsonSerializationContext; 
import com.google.gson.JsonSerializer; 
import java.io.IOException; 
import java.lang.reflect.Type; 
import java.sql.Timestamp; 
import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder; 
 
/**
 *toJson的相关方法
 * @author Administrator
 */ 
public class GSONTOOLS { 
 
    /**
     * 获取GSON转换模式,默认日期格式为“yyyy-MM-dd HH:mm:ss”
     * @return
     */ 
    public static Gson getGson() { 
        GsonBuilder builder = new GsonBuilder(); 
        // 不转换没有 @Expose 注解的字段 
        builder.excludeFieldsWithoutExposeAnnotation(); 
        builder.registerTypeAdapter(Timestamp.class, new TimestampTypeAdapter()).setDateFormat("yyyy-MM-dd HH:mm:ss").create(); 
        builder.registerTypeHierarchyAdapter(byte[].class, new ByteArrayTypeAdapter()).create(); 
        Gson gson = builder.create(); 
        return gson; 
    } 
 
    /**
     * 获取GSON转换模式,设置时间格式为dataFat
     * @param dataFat 时间格式
     * @return
     */ 
    public static Gson getGson(String dataFat) { 
        GsonBuilder builder = new GsonBuilder(); 
        // 不转换没有 @Expose 注解的字段 
        builder.excludeFieldsWithoutExposeAnnotation(); 
        builder.registerTypeAdapter(Timestamp.class, new TimestampTypeAdapter()).setDateFormat(dataFat).create(); 
        builder.registerTypeHierarchyAdapter(byte[].class, new ByteArrayTypeAdapter()).create(); 
        Gson gson = builder.create(); 
        return gson; 
    } 

 
/**
 * json包含日期类型的时候的处理方法
 * @author Administrator
 */ 
class TimestampTypeAdapter implements JsonSerializer<Timestamp>, JsonDeserializer<Timestamp> { 
 
    private final DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
 
    public JsonElement serialize(Timestamp src, Type arg1, JsonSerializationContext arg2) { 
        String dateFormatAsString = format.format(new Date(src.getTime())); 
        return new JsonPrimitive(dateFormatAsString); 
    } 
 
    public Timestamp deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
        if (!(json instanceof JsonPrimitive)) { 
            throw new JsonParseException("The date should be a string value"); 
        } 
 
        try { 
            Date date = format.parse(json.getAsString()); 
            return new Timestamp(date.getTime()); 
        } catch (ParseException e) { 
            throw new JsonParseException(e); 
        } 
    } 

 
class ByteArrayTypeAdapter implements JsonSerializer<byte[]>, JsonDeserializer<byte[]> { 
 
    public JsonElement serialize(byte[] src, Type typeOfSrc, JsonSerializationContext context) { 
        BASE64Encoder encode = new BASE64Encoder(); 
        String base64 = encode.encode(src); 
        return new JsonPrimitive(base64); 
    } 
 
    public byte[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
        if (!(json instanceof JsonPrimitive)) { 
            throw new JsonParseException("The date should be a string value"); 
        } 
        try { 
            BASE64Decoder decode = new BASE64Decoder(); 
            byte[] base64 = decode.decodeBuffer(json.getAsString()); 
            return base64; 
        } catch (IOException ex) { 
        } 
        return null; 
    } 

使用这个类将byte[]通过base64进行压缩,降低JSON的数据量4倍左右。

摘自 狐狸爱上猫----JAVA LINUX SWING EXTJS AJAX专栏

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,