public NettyMessage decode(ByteBuf in) throws Exception {
    NettyMessage message = new NettyMessage();
    Header header = new Header();
    header.setCrcCode(in.readInt());
    header.setLength(in.readInt());
    header.setSessionID(in.readLong());
    header.setType(in.readByte());
    header.setPriority(in.readByte());

    int size = in.readInt();
    if (size > 0) {
      Map<String, Object> attch = new HashMap<String, Object>(size);
      int keySize = 0;
      byte[] keyArray = null;
      String key = null;
      for (int i = 0; i < size; i++) {
        keySize = in.readInt();
        keyArray = new byte[keySize];
        in.readBytes(keyArray);
        key = new String(keyArray, "UTF-8");
        attch.put(key, marshallingDecoder.decode(in));
      }
      keyArray = null;
      key = null;
      header.setAttachment(attch);
    }
    if (in.readableBytes() > 4) {
      message.setBody(marshallingDecoder.decode(in));
    }
    message.setHeader(header);
    return message;
  }
  /**
   * @param args
   * @throws Exception
   */
  public static void main(String[] args) throws Exception {
    TestCodeC testC = new TestCodeC();
    NettyMessage message = testC.getMessage();
    System.out.println(message + "[body ] " + message.getBody());

    for (int i = 0; i < 5; i++) {
      ByteBuf buf = testC.encode(message);
      NettyMessage decodeMsg = testC.decode(buf);
      System.out.println(decodeMsg + "[body ] " + decodeMsg.getBody());
      System.out.println("-------------------------------------------------");
    }
  }
 public NettyMessage getMessage() {
   NettyMessage nettyMessage = new NettyMessage();
   Header header = new Header();
   header.setLength(123);
   header.setSessionID(99999);
   header.setType((byte) 1);
   header.setPriority((byte) 7);
   Map<String, Object> attachment = new HashMap<String, Object>();
   for (int i = 0; i < 10; i++) {
     attachment.put("ciyt --> " + i, "lilinfeng " + i);
   }
   header.setAttachment(attachment);
   nettyMessage.setHeader(header);
   nettyMessage.setBody("abcdefg-----------------------AAAAAA");
   return nettyMessage;
 }
  public ByteBuf encode(NettyMessage msg) throws Exception {
    ByteBuf sendBuf = Unpooled.buffer();
    sendBuf.writeInt((msg.getHeader().getCrcCode()));
    sendBuf.writeInt((msg.getHeader().getLength()));
    sendBuf.writeLong((msg.getHeader().getSessionID()));
    sendBuf.writeByte((msg.getHeader().getType()));
    sendBuf.writeByte((msg.getHeader().getPriority()));
    sendBuf.writeInt((msg.getHeader().getAttachment().size()));
    String key = null;
    byte[] keyArray = null;
    Object value = null;

    for (Map.Entry<String, Object> param : msg.getHeader().getAttachment().entrySet()) {
      key = param.getKey();
      keyArray = key.getBytes("UTF-8");
      sendBuf.writeInt(keyArray.length);
      sendBuf.writeBytes(keyArray);
      value = param.getValue();
      marshallingEncoder.encode(value, sendBuf);
    }
    key = null;
    keyArray = null;
    value = null;
    if (msg.getBody() != null) {
      marshallingEncoder.encode(msg.getBody(), sendBuf);
    } else sendBuf.writeInt(0);
    sendBuf.setInt(4, sendBuf.readableBytes());
    return sendBuf;
  }