使用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;
}
- 使用MINA和XML marshal 传递JAVA 对象
- java XML marshal unmarshal
- 浅谈Java的Mina框架传递对象
- 浅谈Java的Mina框架传递对象
- 浅谈Java的Mina框架传递对象
- 使用Mina传输Java对象
- Mina框架传递对象
- Mina框架传递对象
- Mina框架传递对象
- Mina框架传递对象
- 关于使用Mina做客户端和服务端传递对象的问题
- Java 值传递和对象传递详解
- java 值传递和对象传递
- java之值传递和对象传递
- Java 值传递和对象传递详解
- MINA传递对象时配置过滤器
- java,传递和返回对象
- Java传递和返回对象
- ffmpeg+x264 移植到s3c2410遇到的问题及解决办法
- XML教程:XML有哪些用途?
- 删除sql 2005 日志
- STL map使用详解
- c语言中volatile关键字
- 使用MINA和XML marshal 传递JAVA 对象
- 2000级2班同学聚会邀请函.doc
- 了解WEB页面工具语言XML
- 千年悬棺之谜至今无人解
- 在VS.NET2008下安装WTL8.1
- 2D对象转换为3D对象不会产生模糊的算法
- js图片无缝滚动效果
- 开源测试工具汇总
- 为何XML对Web服务很重要