package com.dianping.pigeon.remoting.common.codec.fst;
import java.io.InputStream;
import java.io.OutputStream;
import com.dianping.pigeon.remoting.common.codec.AbstractSerializer;
import com.dianping.pigeon.remoting.common.exception.SerializationException;
import com.dianping.pigeon.remoting.common.util.InvocationUtils;
import de.ruedigermoeller.serialization.FSTConfiguration;
import de.ruedigermoeller.serialization.FSTObjectInput;
import de.ruedigermoeller.serialization.FSTObjectOutput;
public class FstSerializer extends AbstractSerializer {
static FSTConfiguration conf = FSTConfiguration.createDefaultConfiguration();
public FstSerializer() {
conf.registerClass(InvocationUtils.getRequestClass(), InvocationUtils.getResponseClass());
// conf.registerSerializer(BigInteger.class, new
// FSTBigIntegerSerializer(), true);
// conf.registerSerializer(BigDecimal.class, new
// FSTBigDecimalSerializer(), true);
}
public void registerClass(Class<?>... cls) {
conf.registerClass(cls);
}
public Object deserializeObject(InputStream is) throws SerializationException {
try {
FSTObjectInput in = conf.getObjectInput(is);
Object result = in.readObject();
is.close();
return result;
} catch (Throwable e) {
throw new SerializationException(e.getMessage(), e);
}
}
@Override
public Object deserializeRequest(InputStream is) throws SerializationException {
return deserializeObject(is);
}
@Override
public void serializeRequest(OutputStream os, Object obj) throws SerializationException {
try {
FSTObjectOutput out = conf.getObjectOutput(os);
out.writeObject(obj);
out.flush();
os.close();
} catch (Throwable e) {
throw new SerializationException(e.getMessage(), e);
}
}
@Override
public Object deserializeResponse(InputStream is) throws SerializationException {
return deserializeObject(is);
}
@Override
public void serializeResponse(OutputStream os, Object obj) throws SerializationException {
serializeRequest(os, obj);
}
}