`
ch19880311
  • 浏览: 27501 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Flex与后台传输解压缩大数据量

    博客分类:
  • Flex
阅读更多
本文BlazeDS技术连接flex和java端,以Remote Object方式传输数据为例,
一、Java端返回数据压缩并在前台解压:
首先建一个类ROResult.java来包装返回的result,如下:
import java.io.Serializable;

public class ROResult implements Serializable {

    private static final long serialVersionUID = -6410217400836125781L;
    private Object result;
   
    public ROResult(){
    }
    
    public ROResult(Object res){
        result = res;
    }
}

再建立一个压缩后的二进制存放类CompressedResult.java:
import java.io.Serializable;

public class CompressedResult  implements Serializable{

	private static final long serialVersionUID = 3697351121688911929L;	
	
	byte[] data;

	public byte[] getData() {
		return data;
	}

	public void setData(byte[] data) {
		this.data = data;
	}
	
	public CompressedResult(byte[] data){
		setData(data);
	}
	
	public CompressedResult(){
	}

}

以上两个类也需要在前台也建立对应的VO:
ROResult.as:
	[RemoteClass(alias="com.model.ROResult")]
	public class ROResult {
		public var result:Object;
	}

CompressedResult.as:
	import flash.utils.ByteArray;
	
	[RemoteClass(alias="com.model.CompressedResult")]
	public class CompressedResult
	{
		public function CompressedResult()
		{
		}
		public var data:ByteArray;		

	}


后台调用压缩方法:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;

import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.Amf3Input;
import flex.messaging.io.amf.Amf3Output;

	/**
	 * Try Compress ROResult<br/>
	 * Result will auto-decompressed by BaseCommand on client side.
	 * @param result result to compress
	 * @return true if compressed
	 */
	public static boolean tryCompressROResult(ROResult result){
		if(result==null)return false;
		
		Object ret=result.getResult();
		if(ret==null){//do not compress null
			return false;
		}
		
		byte[] arr=compressAmf(ret);
		
		if(arr!=null){//compress succeeded!
			result.setResult(new CompressedResult(arr));
			return true;
		}
		return false;
	}
	
	public static final int DEFAULTCOMPRESSINGTHRESHOLD=1024;
	public static byte[] compressAmf(Object obj){
		return compressAmf(obj,DEFAULTCOMPRESSINGTHRESHOLD);		
	}
	public static byte[] compressAmf(Object obj,int threshold){
		if(obj==null)return null;
		try{
			ByteArrayOutputStream bout = new ByteArrayOutputStream();
			
	    	SerializationContext context = new SerializationContext();
		    Amf3Output amf3Output = new Amf3Output(context);
		    amf3Output.setOutputStream(bout);		    
			amf3Output.writeObject(obj);			
		    amf3Output.flush();
		    amf3Output.close();
		    
		    int bufLen=bout.size();				    
		    //binary data less than threshold
		    if(bufLen<=threshold){
		    	return null;
		    }
		    byte[] buf=bout.toByteArray();
		    
		    java.util.zip.Deflater  df=
		    	new java.util.zip.Deflater(java.util.zip.Deflater.BEST_COMPRESSION,true);
		    df.setInput(buf);
		    df.finish();
		    
		    //reuse buffer
		    bout.reset();
		    byte[] deflatered=new byte[bufLen];		    
		    while(!df.finished()){		    	
		    	int len=df.deflate(deflatered);
		    	if(len>0){
		    		bout.write(deflatered,0,len);
		    	}
		    }
		    return bout.toByteArray();
		}catch(Exception e){
			return null;
		}
}
	

该方法将result压缩成二进制并转化成CompressedResult类,存入ROResult中。
而前台需要在flex command中解压,如下解压方法:
	import flash.errors.IOError;
	import flash.utils.ByteArray;
         /**
         * Try Decompress ROResult<br/>
         * Use with tryCompressROResult on server side
         * @return true if content is decompressed
         */
         public static function tryDecompressROResult(result:ROResult):Boolean{
         	if(result==null)return false;
         	var ret:Object=result.result;
         	if(ret==null)return false;
         	if(ret is CompressedResult){
         		ret=decompressAmf((ret as CompressedResult).data);
         		if(ret!=null){
         			result.result=ret;
         			return true;
         		}
         	}
         	return false;
         }
         public static function decompressAmf(data:ByteArray):Object{
         	if(data==null)return null;
			try{
				if(data is ByteArray){					
					var b:ByteArray=data as ByteArray;		
					var compressedLength:int=b.length;
					
					var infStartTime:Number=new Date().getTime();
					b.inflate();
					
					var infEndTime:Number=new Date().getTime();
					trace("Compressing rate:"+(Number(compressedLength)/b.length));
					trace("Decompress time cost:"+(infEndTime-infStartTime));					
										
					var ret:Object = b.readObject();
					
					var readEndTime:Number=new Date().getTime();					
					trace("ReadObject time cost:"+(readEndTime-infEndTime));
					return ret;
				}
			}catch(ex:IOError){
				var errInfo:String="IOError during decompressing: "+ex;
				trace(errInfo);
				throw new Error(errInfo);
			}
			return null;
         }

二、Flex端压缩数据并传输到后台解压:
前台压缩方法:
	import flash.utils.ByteArray;
	
	import mx.utils.Base64Decoder;
	import mx.utils.Base64Encoder;
		/**
		 * WARNING:CONTENT COMPRESSED
		 **/
      	public static function serializeToString(value:Object):String{  
             if(value==null){  
                 throw new Error("null isn't a legal serialization candidate");  
             }  
             var bytes:ByteArray = new ByteArray();  
             bytes.writeObject(value);  
             bytes.position = 0;  
             //compress content
             bytes.deflate();
             var be:Base64Encoder = new Base64Encoder();  
             be.encodeBytes(bytes);  
             var res:String = be.toString();  
             be.reset();
             return res;  
         }

该方法将数据压缩成字符串string类型。

后台解压方法:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.Amf3Input;
import flex.messaging.io.amf.Amf3Output;
import flex.messaging.util.Base64;

	/**
	 * Read Object from base64 string to object<br/>
	 * WARNING: COMPRESSED!!
	 * @param <T>
	 * @param amf
	 * @param classType
	 * @return
	 * @throws ClassNotFoundException
	 * @throws IOException
	 */
	@SuppressWarnings("unchecked")
	public static <T> T fromAmf(final String amf, Class<T> classType) throws ClassNotFoundException, IOException {
	    return (T) fromAmf(amf);
	}

	public static Object fromAmf(final String amf) throws IOException, ClassNotFoundException {
		SerializationContext context = new SerializationContext();
	    final Base64.Decoder decoder = new Base64.Decoder();
	    decoder.decode(amf);
	    byte[] input = decoder.flush();
	    decoder.reset();
	    
	    //buffer should be compressed!!
	    input= uncompress(new ByteArrayInputStream(input));
	    
	    InputStream bIn = new ByteArrayInputStream(input);
	    Amf3Input amf3Input = new Amf3Input(context);
	    amf3Input.setInputStream(bIn);
	    return amf3Input.readObject();
	}
	
	
	private static byte[] uncompress(InputStream is) throws IOException{
		java.util.zip.InflaterInputStream  infS=new java.util.zip.InflaterInputStream(
				is,
				new java.util.zip.Inflater(true)
				);
		ByteArrayOutputStream tmp=new ByteArrayOutputStream();
		byte[] buf=new byte[1024];
		for(;;){
			int len=-1;
			try {
				len = infS.read(buf);
			} catch(EOFException eofe){	
				break;
			}catch (IOException e) {
				throw e;
			}
			if(len==-1){
				break;
			}
			tmp.write(buf,0,len);
		}
		return tmp.toByteArray();
	}


该解压接口fromAmf(final String amf, Class<T> classType)两个参数,分别是前台压缩的字符串和解压后的类型。调用例子:List requestIdList = (List)fromAmf(idListString,List.class);
分享到:
评论
3 楼 qq2464785999 2013-03-29  
qq2464785999 写道
非常感谢!复制黏贴基本就可以用,第一个类少了getter setter ..这个不是问题。。再次谢谢

都是杭州的,比我大3天。。
2 楼 qq2464785999 2013-03-29  
非常感谢!复制黏贴基本就可以用,第一个类少了getter setter ..这个不是问题。。再次谢谢
1 楼 lionmusicyj 2013-02-21  
求教 b.inflate();   这个方法哪儿来的

相关推荐

    flex与后台通讯方式

    1. BlazeDS和LCDS:Flex与后台通信通常借助于BlazeDS或LCDS(LiveCycle Data Services),这两个都是Adobe提供的服务器端技术,用于实现Flex与Java或.NET等后端服务的集成。BlazeDS是免费的,而LCDS提供了更高级的...

    Flex数据共享与压缩

    在实际应用中,为了提高性能和用户体验,我们还需要考虑到错误处理和优化策略,比如监控压缩和解压缩的耗时,或者在数据量过大时考虑分片存储(如文件名中的"ShardObj"可能暗示了这一点)。分片存储是指将大数据分割...

    flex 与java后台整合 PPT

    Flex与Java的整合主要依赖于AMF(Action Message Format)协议,它允许Flex客户端与Java服务器之间进行二进制数据交换,提高数据传输效率。 1. **Flex项目配置**: 在开始整合之前,首先需要配置Flex开发环境。...

    flex与后台交互的常用四种方式

    本文将详细探讨Flex与后台交互的四种常见方式:HTTPService、WebService、RemoteObject和URLLoader,以及它们各自的特点和适用场景。 首先,HTTPService是最基础的交互方式,它基于HTTP协议,使用GET和POST方法来...

    flex4与后台数据进行交互

    这是一个关于flex4与后台数据进行交互的内容,个人感觉还不错的。

    flex 文档以及后台数据交互详解

    接下来,我们来讨论Flex与后台数据交互的关键技术。Flex应用程序通常通过HTTP、AMF(Action Message Format)或者Web服务(如SOAP或RESTful API)与后台服务器进行通信。以下是几种常见的交互方式: 1. **...

    Flex与后台交互的几种方法详解

    根据提供的标题、描述、标签及部分内容,本文将详细介绍Flex与后台进行交互的三种主要方法:通过FlashVars传递参数、利用HttpService服务以及采用URLLoader组件。这些方法在Flex开发中非常常见,对于实现数据的前后...

    Flex与后台交互的方法

    Flex与后台交互的方法是其核心功能之一,确保前端用户界面与后端数据服务之间的无缝通信。以下将详细介绍Flex与后台交互的常见方法和相关知识点。 1. **AMF (Action Message Format)** AMF是Flex与服务器之间进行...

    flex开发例子 flex与后台交互的例子 flex工程

    通过深入研究和理解这个"flexDemo"工程,你可以掌握Flex与后台交互的基本流程和技巧,包括数据请求、数据解析、错误处理和用户界面的动态更新。这对于开发复杂的Flex应用至关重要。同时,也可以结合具体的后台技术和...

    flex 后台管理系统

    AMF是一种高效的数据序列化格式,适用于Flex与服务器间的二进制数据传输,可以显著提高数据传输速度和减少带宽消耗。 6. 客户端-服务器通信:在Flex后台管理系统中,用户在前端进行的操作会通过HTTP或HTTPS请求发送...

    flex-air解压缩工具

    《Flex Air解压缩工具详解与应用》 在IT行业中,数据的压缩与解压缩是日常工作中常见的操作。本文将深入探讨“Flex Air解压缩工具”的核心功能、使用方法及其背后的技术原理,帮助开发者更好地理解和利用这个实用的...

    flex 打包解压缩

    在Flex Air中,我们有时需要处理文件的压缩和解压缩操作,例如打包项目资源或者传输数据。`ZipArchive` 类是Flex提供的一个强大工具,用于处理ZIP格式的压缩文件,包括创建、读取和更新ZIP文件。这个类允许开发者...

    Eclipse开发Flex新手必学例子(后台数据页面显示N种图表)

    对于初学者来说,掌握这些图表的创建方法是理解Flex应用程序与后台数据交互的关键。 首先,Flex是一种基于ActionScript和MXML的开源框架,用于构建富互联网应用(RIA)。它允许开发者创建具有高度交互性和动态视觉...

    Flex数据传输与交互

    对于复杂的业务逻辑或大数据量的应用场景,可能需要通过服务端脚本或API接口来传输数据。例如,可以使用HTTPService组件来发送HTTP请求,并接收服务端返回的数据: ```actionscript var httpService:HTTPService = ...

    FLEX数据传输与交互

    1. AMF (Action Message Format):AMF是FLEX与服务器间进行数据交换的标准格式,它提供了高效的序列化和反序列化机制,使得数据在网络中传输时占用更少的带宽。AMF支持多种数据类型,包括对象、数组、日期等,并且...

    flex与后台servlet建立连接

    Flex是Adobe公司开发的一种富...综上所述,Flex与后台Servlet建立连接的过程涉及到了前端与后端的数据交互、AMF通信、服务配置、XML数据处理等多个方面。理解并掌握这些知识点,对于开发富互联网应用程序至关重要。

    Flex与后台交互的方法_HTTPService_WebService_URLLoader

    本篇文章将详细探讨Flex与后台交互的三种主要方法:HTTPService、WebService和URLLoader。 1. HTTPService: HTTPService是Flex中用于处理HTTP请求的组件,基于标准的HTTP协议进行通信。通过HTTPService,开发者...

    Flex与java交换数据 Flex数据交换 Flex与java交换数据教程

    Flex数据交换的基础是AMF(Action Message Format),它是一种二进制的消息格式,由Adobe设计用于提高Flex与服务器之间的数据传输效率。AMF不仅压缩数据,还支持序列化,使得对象能在客户端和服务器之间直接传递,...

    Flex 连接后台Java的几种方法选择

    这种方法的优点是易于使用,适用于数据量不是很大的情况,因此一般较简单的 Flex 应用都采用这种交互方式。然而,缺点是效率不是很高,在数据量较大时表现比较明显。 Webservice Webservice 是一种基于 SOAP 协议...

    flex之低数据量通信实例源码

    低数据量通信可能意味着只上传或下载小文件,或者通过分块传输大文件以降低对网络带宽的影响。源码可能展示了如何实现文件选择、进度显示和错误处理等功能。 4. **数据管理与优化**:在处理低数据量通信时,有效的...

Global site tag (gtag.js) - Google Analytics