package com.dianping.pigeon.remoting.common.codec.fst;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import de.ruedigermoeller.serialization.FSTBasicObjectSerializer;
import de.ruedigermoeller.serialization.FSTClazzInfo;
import de.ruedigermoeller.serialization.FSTClazzInfo.FSTFieldInfo;
import de.ruedigermoeller.serialization.FSTObjectInput;
import de.ruedigermoeller.serialization.FSTObjectOutput;
public class FSTBigDecimalSerializer extends FSTBasicObjectSerializer {
@Override
public void writeObject(FSTObjectOutput out, Object toWrite, FSTClazzInfo clzInfo, FSTFieldInfo referencedBy,
int streamPosition) throws IOException {
BigDecimal value = (BigDecimal) toWrite;
out.writeInt(value.scale());
byte[] unscaledValue = ((BigInteger) value.unscaledValue()).toByteArray();
out.writeInt(unscaledValue.length);
out.write(unscaledValue);
}
@Override
public Object instantiate(Class objectClass, FSTObjectInput in, FSTClazzInfo serializationInfo,
FSTFieldInfo referencee, int streamPosition) throws IOException, ClassNotFoundException,
InstantiationException, IllegalAccessException {
int scale = in.readInt();
byte[] buf = new byte[in.readInt()];
in.read(buf);
BigInteger unscaledValue = new BigInteger(buf);
BigDecimal value = new BigDecimal(unscaledValue, scale);
in.registerObject(value, streamPosition, serializationInfo, referencee);
return value;
}
}