关于将Java中序列化对象写入byte[]遇到的一些问题及解决方法

来源:互联网 发布:万能五笔 mac 编辑:程序博客网 时间:2024/05/29 17:09

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

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



0 0
原创粉丝点击