Red de conocimiento informático - Material del sitio web - Cómo analizar AMF en Android

Cómo analizar AMF en Android

AMF es un formato de transmisión de código abierto desarrollado por Adobe y se utiliza en muchos lugares, como transmisión flash y en segundo plano, medios de transmisión red5, etc. En realidad, el servidor BlazeDS de Adobe ya proporciona el código sobre cómo analizar AMF, pero debido a que el acoplamiento es un poco alto, algunos entusiastas extrajeron la parte de análisis de AMF del código fuente del servidor BlazeDS y lo colocaron en la base de código de Google

Esta biblioteca no tiene ningún problema cuando se usa en el entorno Java, pero cuando se usa en el entorno Android, se informarán algunos errores, como PropertyDescriptor no encontrado o no se puede analizar.

La razón es que parece que no hay una clase PropertyDescriptor en el JavaSDK de Android 1.6, y PropertyDescriptor es una clase de introspección, que en realidad tiene algunas funciones. Podemos usar la reflexión básica para simular estas funciones:

importjava. lang. reflect .Method;

publicclassPropertyDescriptor{

privateStringname;

privateStringdisplayName;

privateMethodreadMethod;

privateMethodwriteMethod ;

p>

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=nombre ;

}

publicStringgetDisplayName(){

returndisplayName;

}

publicvoidsetDisplayName( StringdisplayName){

this.displayName=displayName;

}

publicMethodgetReadMethod(){

returnreadMethod;

p>

}

publicvoidsetReadMethod(MétodoreadMethod){

this.readMethod=readMethod;

}

publicMethodgetWriteMethod(){

returnwriteMethod;

}

publicvoidsetWriteMethod(MethodwriteMethod){

this.publicclassPropertyDescriptorHelper{

publicstaticListlt;PropertyDescriptorgt ;getPropertyDescriptors(Classlt;?gt;type){

Listlt;PropertyDescriptorgt;lsDescriptor=newArrayListlt;PropertyDescriptorgt;();

Método[ ]arryMethod=type .getMethods();

Maplt; Cadena, Métodogt; dicMethod=newHashMaplt; Cadena, Métodogt (); >

if(method.getName( ).startsWith("set")amp;amp;method.getParameterType()! =nullamp;amp;method.getParameterType().length==1){

dicMet

hod.put(method.getName(), método);

}

}

for(Methodmethod:aryMethod){

if(method.getName().startsWith("get")amp;amp;method.getParameterType().length==0){

Stringname=Character.toLowerCase(method.getName().charAt (3)) método.getName().substring(4, método.setReadMethod(método);

StringsetMethodName="set " nombre.substring(0, 1).toUpperCase() nombre.substring(1 , nombre.length());

if (dicMethod.containsKey(setMethodName)){

desc.setWriteMethod(dicMethod.get(setMethodName));

}

lsDescriptor.add(desc);

}elseif(method.getName().startsWith("is")amp;amp; método.getParameterType().length= =0){

Stringname=Character.method.getName().setReadMethod(método);

StringsetMethodName="establecer " nombre.substring(0, 1).toUpperCase() name.substring(1, name.length());

if(dicMethod.containsKey(setMethodName)){

desc.setWriteMethod(dicMethod.get(setMethodName));

}

lsDescriptor.add(desc);

}

}

}

}

returnlsDescriptor;

}

publicstaticListlt;PropertyDescriptorgt;getPropertyDescriptors(Objectbean){

returngetPropertyDescriptors(bean.getClass() );

}

}

Con estas dos clases, puede encontrar todos los lugares donde se usa PropertyDescriptor en la biblioteca amf-serializer y reemplazarlo por En las dos clases que escribimos, la funcionalidad básica para analizar AMF ya está ahí.

Sin embargo, el uso exclusivo de esta biblioteca solo puede analizar AMF y no puede interactuar con el servidor.

Esto también es muy simple. Hay una clase AMFConnection en el código fuente del servidor BlazeDS, que encapsula la clase HttpURLConnection del JDK y se usa para la transmisión de red y la serialización y deserialización de AMF. Solo necesitamos llamarla y modificarla para usarla.

Por cierto, AMF en realidad admite llamadas de múltiples métodos. El principio es agregar múltiples AMFBodys en un AMFMessage. Cada AMFBody es una llamada de método, pero AMFConnection no admite llamadas de múltiples métodos. Consulte la clase AMFConnection en el método de llamada de la clase AMFConnection.

AMFBody es una llamada a un método.