package com.github.davidmoten.rx.buffertofile; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public final class DataSerializers { private DataSerializers() { // prevent instantiation } public static DataSerializer<String> string() { return StringHolder.INSTANCE; } private static final class StringHolder { final static DataSerializer<String> INSTANCE = new DataSerializer<String>() { @Override public void serialize(DataOutput output, String t) throws IOException { output.writeUTF(t); } @Override public String deserialize(DataInput input) throws IOException { return input.readUTF(); } @Override public int size() { return 0; } }; } public static DataSerializer<Integer> integer() { return IntegerHolder.INSTANCE; } private static final class IntegerHolder { final static DataSerializer<Integer> INSTANCE = new DataSerializer<Integer>() { @Override public void serialize(DataOutput output, Integer t) throws IOException { output.writeInt(t); } @Override public Integer deserialize(DataInput input) throws IOException { return input.readInt(); } @Override public int size() { return 4; } }; } public static DataSerializer<byte[]> byteArray() { return ByteArrayHolder.INSTANCE; } private static final class ByteArrayHolder { final static DataSerializer<byte[]> INSTANCE = new DataSerializer<byte[]>() { @Override public void serialize(DataOutput output, byte[] bytes) throws IOException { output.writeInt(bytes.length); output.write(bytes); } @Override public byte[] deserialize(DataInput input) throws IOException { int length = input.readInt(); byte[] bytes = new byte[length]; input.readFully(bytes); return bytes; } @Override public int size() { return 0; } }; } @SuppressWarnings("unchecked") public static <T> DataSerializer<T> javaIO() { return (DataSerializer<T>) JavaIOHolder.INSTANCE; } private static final class JavaIOHolder { final static DataSerializer<Object> INSTANCE = new DataSerializer<Object>() { @Override public void serialize(DataOutput output, Object object) throws IOException { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bytes); oos.writeObject(object); oos.close(); byte[] array = bytes.toByteArray(); output.writeInt(array.length); output.write(array); } @Override public Object deserialize(DataInput input) throws IOException { int length = input.readInt(); byte[] array = new byte[length]; input.readFully(array); ObjectInputStream ois = null; try { ois = new ObjectInputStream(new ByteArrayInputStream(array)); return ois.readObject(); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } finally { if (ois != null) { try { ois.close(); } catch (IOException e) { // ignore } } } } @Override public int size() { return 0; } }; } }