前面寫了個傳輸的原型,如今應該寫一下消息的編解碼javascript
其實消息的編解碼很簡單,Socket通常用來傳輸byte[] ,只要把一個Message的JavaBean對像轉成碼流,再將其從碼流轉回成原來的對像就能夠了,在這裏咱們有幾種實現的方法java
1.寫一些類型轉換的類,好比int to bytes , longToBytes , StringToBytes ..... 再對每一個類進行轉換就能夠了,這樣的好處就是速度會比較快,可是代碼要寫不少,每一個類都須要爲他寫一個定製的轉換的encode與decode,其中可能有人要問爲何String還要寫一個toBytes的方法呢? 實際上是由於咱們要將一個JavaBean轉成一個碼流,咱們並不知道String是在這個碼流的什麼位置,就算知道位置也不能肯定他的長度,由於他是個變長的,因此咱們會在String.toBytes後再在前面加一段四個字節的Int型的length。app
2.經過反射將類轉換成碼流,這個方法能夠作到通用,可是性能上沒有保證。性能
3.直接序列化與反序列化spa
其中2與3來作的話開始我準備用2,性能也要比序列化快一倍以上,能夠在類不斷的變的複雜時性能也在成倍的減小,最後居然還不如序列化了因此2號方法就再也不採用直接用序列化的方法。code
簡單的代碼在下面,沒有做過多的處理,之後有機會再完善吧,其實這個方法在commons-lang包中也有能夠查看他的原碼blog
- package demo;
-
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
-
- public class Coder {
-
- public static byte[] encode(Object obj) throws IOException {
- ByteArrayOutputStream bis = null;
- ObjectOutputStream os = null;
- try {
- bis = new ByteArrayOutputStream(1024);
- os = new ObjectOutputStream(bis);
- os.writeObject(obj);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (bis != null)
- bis.close();
- if (os != null)
- os.close();
- }
- return bis.toByteArray();
- }
-
- public static Object decode(byte[] src) throws IOException,
- ClassNotFoundException {
- ObjectInputStream ois = null;
- ByteArrayInputStream bos = null;
- try {
- bos = new ByteArrayInputStream(src);
- ois = new ObjectInputStream(bos);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (bos != null)
- bos.close();
- if (ois != null)
- ois.close();
- }
- return ois.readObject();
- }
-
- }