package net.varkhan.base.conversion.serializer.composite; import net.varkhan.base.conversion.serializer.Serializer; import net.varkhan.base.conversion.serializer.primitives.VariadicSerializer; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; /** * <b>Generic map serializer</b>. * <p/> * Serializes a key-value map. * <p/> * * @author varkhan * @date 5/28/11 * @time 3:52 AM */ public class MapSerializer<K,V,C> implements Serializer<Map<K,V>,C> { private final Serializer<K,C> kser; private final Serializer<V,C> vser; public MapSerializer(Serializer<K,C> kser, Serializer<V,C> vser) { this.kser=kser; this.vser=vser; } public Map<K,V> decode(InputStream stm, C ctx) { long size=VariadicSerializer._decode(stm); Map<K,V> map=new HashMap<K,V>((int)size); for(long i=0;i<size;i++) { K key=kser.decode(stm, ctx); V val=vser.decode(stm, ctx); map.put(key, val); } return map; } public Map<K,V> decode(ByteBuffer buf, C ctx) { long size=VariadicSerializer._decode(buf); Map<K,V> map=new HashMap<K,V>((int)size); for(long i=0;i<size;i++) { K key=kser.decode(buf, ctx); V val=vser.decode(buf, ctx); map.put(key, val); } return map; } public Map<K,V> decode(byte[] dat, long pos, long len, C ctx) { long size=VariadicSerializer._decode(dat, pos, len); pos+=VariadicSerializer._length(size); Map<K,V> map=new HashMap<K,V>((int)size); for(long i=0;i<size;i++) { K key=kser.decode(dat, pos, len, ctx); pos+=kser.length(key, ctx); V val=vser.decode(dat, pos, len, ctx); pos+=vser.length(val, ctx); map.put(key, val); } return map; } public long encode(Map<K,V> obj, OutputStream stm, C ctx) { long c=VariadicSerializer._encode(obj.size(), stm); for(Map.Entry<K,V> ent : obj.entrySet()) { c+=kser.encode(ent.getKey(), stm, ctx); c+=vser.encode(ent.getValue(), stm, ctx); } return c; } public long encode(Map<K,V> obj, ByteBuffer buf, C ctx) { long c=VariadicSerializer._encode(obj.size(), buf); for(Map.Entry<K,V> ent : obj.entrySet()) { c+=kser.encode(ent.getKey(), buf, ctx); c+=vser.encode(ent.getValue(), buf, ctx); } return c; } public long encode(Map<K,V> obj, byte[] dat, long pos, long len, C ctx) { long c=VariadicSerializer._encode(obj.size(), dat, pos, len); for(Map.Entry<K,V> ent : obj.entrySet()) { c+=kser.encode(ent.getKey(), dat, pos+c, len-c, ctx); c+=vser.encode(ent.getValue(), dat, pos+c, len-c, ctx); } return c; } public long length(Map<K,V> obj, C ctx) { long c=VariadicSerializer._length(obj.size()); for(Map.Entry<K,V> ent : obj.entrySet()) { c+=kser.length(ent.getKey(), ctx); c+=vser.length(ent.getValue(), ctx); } return c; } }