本文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);
分享到:
相关推荐
1. BlazeDS和LCDS:Flex与后台通信通常借助于BlazeDS或LCDS(LiveCycle Data Services),这两个都是Adobe提供的服务器端技术,用于实现Flex与Java或.NET等后端服务的集成。BlazeDS是免费的,而LCDS提供了更高级的...
在实际应用中,为了提高性能和用户体验,我们还需要考虑到错误处理和优化策略,比如监控压缩和解压缩的耗时,或者在数据量过大时考虑分片存储(如文件名中的"ShardObj"可能暗示了这一点)。分片存储是指将大数据分割...
Flex与Java的整合主要依赖于AMF(Action Message Format)协议,它允许Flex客户端与Java服务器之间进行二进制数据交换,提高数据传输效率。 1. **Flex项目配置**: 在开始整合之前,首先需要配置Flex开发环境。...
本文将详细探讨Flex与后台交互的四种常见方式:HTTPService、WebService、RemoteObject和URLLoader,以及它们各自的特点和适用场景。 首先,HTTPService是最基础的交互方式,它基于HTTP协议,使用GET和POST方法来...
这是一个关于flex4与后台数据进行交互的内容,个人感觉还不错的。
接下来,我们来讨论Flex与后台数据交互的关键技术。Flex应用程序通常通过HTTP、AMF(Action Message Format)或者Web服务(如SOAP或RESTful API)与后台服务器进行通信。以下是几种常见的交互方式: 1. **...
根据提供的标题、描述、标签及部分内容,本文将详细介绍Flex与后台进行交互的三种主要方法:通过FlashVars传递参数、利用HttpService服务以及采用URLLoader组件。这些方法在Flex开发中非常常见,对于实现数据的前后...
Flex与后台交互的方法是其核心功能之一,确保前端用户界面与后端数据服务之间的无缝通信。以下将详细介绍Flex与后台交互的常见方法和相关知识点。 1. **AMF (Action Message Format)** AMF是Flex与服务器之间进行...
通过深入研究和理解这个"flexDemo"工程,你可以掌握Flex与后台交互的基本流程和技巧,包括数据请求、数据解析、错误处理和用户界面的动态更新。这对于开发复杂的Flex应用至关重要。同时,也可以结合具体的后台技术和...
AMF是一种高效的数据序列化格式,适用于Flex与服务器间的二进制数据传输,可以显著提高数据传输速度和减少带宽消耗。 6. 客户端-服务器通信:在Flex后台管理系统中,用户在前端进行的操作会通过HTTP或HTTPS请求发送...
《Flex Air解压缩工具详解与应用》 在IT行业中,数据的压缩与解压缩是日常工作中常见的操作。本文将深入探讨“Flex Air解压缩工具”的核心功能、使用方法及其背后的技术原理,帮助开发者更好地理解和利用这个实用的...
在Flex Air中,我们有时需要处理文件的压缩和解压缩操作,例如打包项目资源或者传输数据。`ZipArchive` 类是Flex提供的一个强大工具,用于处理ZIP格式的压缩文件,包括创建、读取和更新ZIP文件。这个类允许开发者...
对于初学者来说,掌握这些图表的创建方法是理解Flex应用程序与后台数据交互的关键。 首先,Flex是一种基于ActionScript和MXML的开源框架,用于构建富互联网应用(RIA)。它允许开发者创建具有高度交互性和动态视觉...
对于复杂的业务逻辑或大数据量的应用场景,可能需要通过服务端脚本或API接口来传输数据。例如,可以使用HTTPService组件来发送HTTP请求,并接收服务端返回的数据: ```actionscript var httpService:HTTPService = ...
1. AMF (Action Message Format):AMF是FLEX与服务器间进行数据交换的标准格式,它提供了高效的序列化和反序列化机制,使得数据在网络中传输时占用更少的带宽。AMF支持多种数据类型,包括对象、数组、日期等,并且...
Flex是Adobe公司开发的一种富...综上所述,Flex与后台Servlet建立连接的过程涉及到了前端与后端的数据交互、AMF通信、服务配置、XML数据处理等多个方面。理解并掌握这些知识点,对于开发富互联网应用程序至关重要。
本篇文章将详细探讨Flex与后台交互的三种主要方法:HTTPService、WebService和URLLoader。 1. HTTPService: HTTPService是Flex中用于处理HTTP请求的组件,基于标准的HTTP协议进行通信。通过HTTPService,开发者...
Flex数据交换的基础是AMF(Action Message Format),它是一种二进制的消息格式,由Adobe设计用于提高Flex与服务器之间的数据传输效率。AMF不仅压缩数据,还支持序列化,使得对象能在客户端和服务器之间直接传递,...
这种方法的优点是易于使用,适用于数据量不是很大的情况,因此一般较简单的 Flex 应用都采用这种交互方式。然而,缺点是效率不是很高,在数据量较大时表现比较明显。 Webservice Webservice 是一种基于 SOAP 协议...
低数据量通信可能意味着只上传或下载小文件,或者通过分块传输大文件以降低对网络带宽的影响。源码可能展示了如何实现文件选择、进度显示和错误处理等功能。 4. **数据管理与优化**:在处理低数据量通信时,有效的...