Project: astyanax
package com.netflix.astyanax.serializers;
 
import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.nio.ByteBuffer; 
 
import com.netflix.astyanax.Serializer; 
import com.netflix.astyanax.connectionpool.exceptions.SerializationException; 
 
/**
 * The ObjectSerializer is used to turn objects into their binary 
 * representations. 
 *  
 * @author Bozhidar Bozhanov 
 *  
 */
 
public class ObjectSerializer extends AbstractSerializer<Object> implements Serializer<Object> { 
 
    private static final ObjectSerializer INSTANCE = new ObjectSerializer(); 
 
    @Override 
    public ByteBuffer toByteBuffer(Object obj) { 
        try { 
            ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
            ObjectOutputStream oos = new ObjectOutputStream(baos); 
            oos.writeObject(obj); 
            oos.close(); 
 
            return ByteBuffer.wrap(baos.toByteArray()); 
        } 
        catch (IOException ex) { 
            throw new RuntimeException(ex); 
        } 
    } 
 
    @Override 
    public Object fromByteBuffer(ByteBuffer bytes) { 
        if ((bytes == null) || !bytes.hasRemaining()) { 
            return null
        } 
        try { 
            int l = bytes.remaining(); 
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes.array(), bytes.arrayOffset() + bytes.position(), 
                    l); 
            ObjectInputStream ois = new ObjectInputStream(bais); 
            Object obj = ois.readObject(); 
            bytes.position(bytes.position() + (l - ois.available())); 
            ois.close(); 
            return obj; 
        } 
        catch (Exception ex) { 
            throw new SerializationException(ex); 
        } 
    } 
 
    public static ObjectSerializer get() { 
        return INSTANCE; 
    } 
}