使用MINA和XML marshal 传递JAVA 对象

来源:互联网 发布:java正则 编辑:程序博客网 时间:2024/04/29 17:26

APACHE MINA 是一个比较好的网络应用开发框架,比较适合用于java 网络通讯应用程序开发,默认支持的JAVA 对象传递是Serializer ,但Serializer 有些问题,加上如果使用XML传递网络监控比较简单,因此可以考虑利用JAVA 5/6支持的XML MASHAL将java对象先XML mashal,然后在对端unmashal。

以下是一些关键代码,先创建用于传递信息的类:

public class XMLObjectPackage {
 
 static Logger logger = Logger.getLogger(XMLObjectPackage.class.getName());
 /**
  * 总长度,等于XML长度+PACKAGE NAME 长度+4
  */
 int length;
 String XML;
 int ClassLength;
 String ClassName;
 
 

 public XMLObjectPackage(Object obj, Charset XmlCharset) throws JAXBException {
  //String s;
  XML = XmlMarshaller.marshal(obj,XmlCharset);
  //length=;
  ClassName=obj.getClass().getName();
  ClassLength=ClassName.getBytes(XmlCharset).length;
  length=XML.getBytes(XmlCharset).length+ClassLength+4;
  logger.debug(length+":"+ClassLength+":"+ClassName+":"+XML);
  //super();
  // TODO Auto-generated constructor stub
 }


 public int getLength() {
  return length;
 }
 
 
 public String getXML() {
  return XML;
 }


 public int getClassLength() {
  return ClassLength;
 }


 public String getClassName() {
  return ClassName;
 }

}

 

encode 关键代码:

@Override
 public void encode(IoSession arg0, Object obj, ProtocolEncoderOutput arg2)
   throws Exception {
  
  
  
  XMLObjectPackage request = new XMLObjectPackage(obj,XmlCharset);
        IoBuffer buffer = IoBuffer.allocate(request.getLength()+request.getClassLength()+8, false);
        buffer.setAutoExpand(true);
        buffer.putInt(request.getLength());
        buffer.putInt(request.getClassLength());
       
        buffer.put(request.getClassName().getBytes(XmlCharset));
        buffer.put(request.getXML().getBytes(XmlCharset));
        buffer.flip();
        logger.debug("buffer length:"+buffer.array().length);
        arg2.write(buffer);

  
 }

 

decode 关键代码:

@Override
 protected boolean doDecode(IoSession arg0, IoBuffer arg1,
   ProtocolDecoderOutput arg2) throws Exception {
  // TODO Auto-generated method stub
  logger.debug("doDecode...."+arg1.remaining());
  if (arg1.prefixedDataAvailable(4)){
   arg1.position(0);
   int length=arg1.getInt();
   
   
   //int request.getLength()+request.getPackageLength()
   
   if (arg1.remaining()>=length){ //read all
    
    int ClassLength=arg1.getInt();
    logger.debug("doDecode...."+length+":"+arg1.remaining()+":"+ClassLength);    
    byte ClassName[]=new byte[ClassLength];
    logger.debug("doDecode...."+length+":"+arg1.remaining()+":"+ClassLength);  
    byte dst[]=new byte[length-ClassLength-4];
    arg1.get(ClassName);
    arg1.get(dst);
    //String pname=new String(packagename);
    //String xml=new String(dst);
    
    String cname=new String(ClassName,XmlCharset);
    String xml=new String(dst,XmlCharset);
    logger.debug("package xml:"+ClassName+" "+xml);
    Object o=XmlMarshaller.unmarshal(Class.forName(cname), xml);
    
    //XMLObjectPackage pack = new XMLObjectPackage(length, dst,XmlCharset); 
    //System.out.println(pack.getXML());
    
    
    logger.debug("after doDecode...."+length+":"+arg1.remaining());
                arg2.write(o);  
   }
  }
  
  return false;
 }

 

原创粉丝点击