package com.github.yuriyao.FLRMI.FLRMIImpl;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.lang.reflect.Method;
import com.github.yuriyao.FLRMI.FLRMISerizableCenter;
import com.thoughtworks.xstream.XStream;
import com.github.yuriyao.FLRMI.FLRMIException;
/**
* xml方式进行序列化的工具
* 这种方法实现的最好不要用于实际应用中,只要用于测试
*
* @author fengjing.yfj
* @version $Id: XMLSerizableMessageMetaImpl.java, v 0.1 2014年1月27日 下午3:24:49 fengjing.yfj Exp $
*/
public class XMLSerizableMessageMetaImpl extends AbstractSerizableMessageMeta {
/** mark */
private static final Integer MARK = 0x1234123;
/** 单例 */
private static final XMLSerizableMessageMetaImpl XML_SERIZABLE_MESSAGE_META_IMPL = new XMLSerizableMessageMetaImpl();
/** xml序列化工具 */
private final XStream stream = new XStream();
//将工具注册到注册中心
static {
FLRMISerizableCenter
.registerSerizableMessageMetaIfNotExist(XML_SERIZABLE_MESSAGE_META_IMPL);
}
/**
* 默认的构造函数
*/
private XMLSerizableMessageMetaImpl() {
}
/**
* 创建单例
* @return
*/
public static XMLSerizableMessageMetaImpl create() {
return XML_SERIZABLE_MESSAGE_META_IMPL;
}
@Override
public Integer getMark() {
return MARK;
}
@Override
protected void writeTarget(ObjectOutput output, Object target) {
try {
output.writeObject(stream.toXML(target));
} catch (Exception e) {
e.printStackTrace();
throw new FLRMIException("无法序列化目标对象[" + target + "]");
}
}
@Override
protected void writeMethod(ObjectOutput output, Method method) {
try {
output.writeObject(stream.toXML(method));
} catch (Exception e) {
e.printStackTrace();
throw new FLRMIException("无法序列化方法对象[" + method + "]");
}
}
@Override
protected void writeParams(ObjectOutput output, Object[] params) {
try {
output.writeObject(stream.toXML(params));
} catch (Exception e) {
e.printStackTrace();
throw new FLRMIException("无法序列化参数对象[" + params + "]");
}
}
@Override
protected Object readTarget(ObjectInput input) {
try {
return stream.fromXML((String) input.readObject());
} catch (Exception e) {
e.printStackTrace();
throw new FLRMIException("无法读取目标对象");
}
}
@Override
protected Method readMethod(ObjectInput input) {
try {
return (Method) stream.fromXML((String) input.readObject());
} catch (Exception e) {
e.printStackTrace();
throw new FLRMIException("无法读取方法对象");
}
}
@Override
protected Object[] readParams(ObjectInput input) {
try {
return (Object[]) stream.fromXML((String) input.readObject());
} catch (Exception e) {
e.printStackTrace();
throw new FLRMIException("无法读取参数对象");
}
}
}