Android编程实战——仿微信群聊-2——对象的网络传输
上一章服务器端有个消息类MyMessage类没有细讲,这里就说一下MyMessage和更重要的网络中对象的传输(对象的序列化和反序列化)。
首先要先了解到数据在网络中的传输是通过输入输出流来进行的。
为了传输的方便性,我们将数据打包封装起来,一般一个最简单的消息体需要有目的,来源,消息内容这三个属性。具体的也可以自己扩展。
MyMessage类:
public class MyMessage implements Serializable{
private static final long serialVersionUID = 1L;
public static final int MSG_AUDIO = 1; //消息类型,语音消息
public static final int MSG_LOGIN = 2; //消息类型,登录消息
public static final int MSG_TEXT = 3; //消息类型,文本消息
public static final int MSG_AUDIO_MARK= 4;// 消息类型,语音消息的标识
private String tip = ""; //额外附带的消息,这里也可以把所有消息放在一起然后通过分隔符区分
private int msgType = -1; //消息类型
private String sendName = ""; //发送者
private String msgContent = ""; //消息内容String
private byte[] msgContentBinary; //消息内容,用来传输文件
// Getter Setter
public String getTip() {
return tip;
}
public void setTip(String tip) {
this.tip = tip;
}
public void setMsgType(int msgType) {
this.msgType = msgType;
}
public void setMsgContent(String msgContent) {
this.msgContent = msgContent;
}
public byte[] getMsgContentBinary() {
return msgContentBinary;
}
public void setMsgContentBinary(byte[] msgContentBinary) {
this.msgContentBinary = msgContentBinary;
}
public void setSendName(String sendName) {
this.sendName = sendName;
}
public int getMsgType() {
return msgType;
}
public String getSendName() {
return sendName;
}
public String getMsgContent() {
return msgContent;
}
/**
* 构造方法
* @param msgType 消息类型
* @param msgContent 消息内容String
*/
public MyMessage(int msgType, String msgContent) {
this.msgType = msgType;
this.msgContent = msgContent;
}
public MyMessage() {
}
/**
* 构造方法
* @param msgType 消息类型
* @param msgContentBinary 消息内容,文件数据
*/
public MyMessage(int msgType, byte[] msgContentBinary) {
this.msgType = msgType;
this.msgContentBinary = msgContentBinary;
}
}
这里因为我只做了群聊,没有做私聊所以没有目的人这个属性,后来我发现好像用键值对Put 和 Get方法可能更方便,大家可以自己扩展实现。
要用流来传输对象,就必须要对对象进行序列化和反序列化了,在Java中这些操作还是很方便的,让需要序列化的类实现Serializable接口,然后用ObjectInputStream和ObjectOutputStream的readObject()和WriteObject()方法就可以了。实现了这个接口后可以定义这个属性serialVersionUID,用来保证服务端和客户端这两个类是相同的,这个属性可以由编译器生成或者自己指定。
对象的网络传输有一点需要注意:两个类的目录必须是相同的,不然会报ClassNoFound异常。
对象的序列化方法是Java默认自带的,我们也可以自己实现序列化这个过程。通过类实现readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out)方法,在方法里面自定义序列化方法。