首先说一下,smack的message本身是可以传递序列化的对象的,本文讨论的是在不知道对象具体信息时如何传递一个对象,即只知道传过来的是一个object,不知道具体是什么样的类实例的object。
最近在做Android开发,设计一个即时通讯软件的开放平台,让它可以为第三方应用传递数据,理想情况下,这种数据可以是数据,也可是一些基本数据类型,也可以是一些自定义对象。前面两者都是好搞定的,关键是对于自定义对象,如果在不知道对方要传递什么样的对象时,如何传输这个对象就是一个问题。
因为在传统网络下我采用的是XMPP的package传递数据时,它传递的是一个个smack的message对象,这些对象本身可以传递基本的数据类型,也可传递序列化的对象,这样,只要第三方应用传递过来序列化的对象是不是就可以传递了呢?想象是美好的,因为在第三方用户传递对象到我的应用中来的时候,实际上在中间发生了转储的过程,在不知道对象类型的情况,是没有办法取出这个对象的,也就根本没有办法传递这个对象。
我在设计这个传递方式的时候,经历了一系列尝试,最后决定将自定义对象转化为byte数组来传递,这样,只要第三方应用将自己的自定义对象转化为byte[]传递进来,我在传递过程中并不需要知道传递的是什么(实际上我也没必要知道,之前想要知道对象的信息完全是因为消息从第三方应用发送到我的APP中时,有一次将对象从bundle中转出的过程),只要传递byte[]就行了,而byte是基本类型,是完全可以传递的。
我写了一个将object转化为byte[]的工具类,下面是源码:
/**
* @Description 序列化、反序列化一个对象
* @author WangFei
* @date 2014-11-6 上午8:30:39
* @version
*/
import android.util.Log;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializeUtil {
public static final String TAG = "SerializeUtil";
/**
* 序列化
*
* @param object
* @return
* @throws IOException
*/
public static byte[] serialize(Object object) throws IOException {
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try {
// 序列化
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
return bytes;
} catch (Exception e) {
Log.e(TAG, "序列化对象发生错误,返回NULL");
return null;
}
}
/**
* 反序列化
*
* @param bytes
* @return
*/
public static Object unserialize(byte[] bytes) {
ByteArrayInputStream bais = null;
try {
// 反序列化
bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception e) {
Log.e(TAG, "反序列化对象发生错误,返回NULL");
return null;
}
}
}
在测试传输的时候遇到一些问题,下一篇文章详谈。