package org.mapdb.serializer; import org.mapdb.DataInput2; import org.mapdb.DataOutput2; import org.mapdb.Serializer; import java.io.IOException; /** * Created by jan on 2/28/16. */ public class SerializerArrayDelta<T> extends SerializerArray<T> { private static final long serialVersionUID = -930920902390439234L; public SerializerArrayDelta() { super(); } public SerializerArrayDelta(Serializer<T> serializer) { super(serializer); } @Override public void valueArraySerialize(DataOutput2 out, Object vals2) throws IOException { Object[] vals = (Object[]) vals2; if (vals.length == 0) return; //write first array Object[] prevKey = (Object[]) vals[0]; out.packInt(prevKey.length); for (Object key : prevKey) { serializer.serialize(out, (T) key); } //write remaining arrays for (int i = 1; i < vals.length; i++) { Object[] key = (Object[]) vals[i]; //calculate number of entries equal with prevKey int len = Math.min(key.length, prevKey.length); int pos = 0; while (pos < len && (key[pos] == prevKey[pos] || serializer.equals((T) key[pos], (T) prevKey[pos]))) { pos++; } out.packInt(pos); //write remaining bytes out.packInt(key.length - pos); for (; pos < key.length; pos++) { serializer.serialize(out, (T) key[pos]); } prevKey = key; } } @Override public Object[] valueArrayDeserialize(DataInput2 in, final int size) throws IOException { Object[] ret = new Object[size]; if (size == 0) return ret; int ss = in.unpackInt(); Object[] prevKey = new Object[ss]; for (int i = 0; i < ss; i++) { prevKey[i] = serializer.deserialize(in, -1); } ret[0] = prevKey; for (int i = 1; i < size; i++) { //number of items shared with prev int shared = in.unpackInt(); //number of items unique to this array int unq = in.unpackInt(); Object[] key = new Object[shared + unq]; //copy items from prev array System.arraycopy(prevKey, 0, key, 0, shared); //and read rest for (; shared < key.length; shared++) { key[shared] = serializer.deserialize(in, -1); } ret[i] = key; prevKey = key; } return ret; } }