首先说一下,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;
		}
	}
}



在测试传输的时候遇到一些问题,下一篇文章详谈。