@Override public Serialiser<Map<? extends Object, ? extends Object>, byte[]> getSerialisation() { MapSerialiser serialiser = new MapSerialiser(); serialiser.setKeySerialiser(new StringSerialiser()); serialiser.setValueSerialiser(new LongSerialiser()); return serialiser; }
@Override public Map<? extends Object, ? extends Object> deserialise(final byte[] bytes) throws SerialisationException { Map map; if (null == getMapClass()) { map = new HashMap<>(); } else { try { map = getMapClass().newInstance(); } catch (final IllegalAccessException | IllegalArgumentException | SecurityException | InstantiationException e) { throw new SerialisationException("Failed to create map instance" + e.getMessage(), e); } } final int arrayLength = bytes.length; int carriage = 0; while (carriage < arrayLength) { LengthValueBytesSerialiserUtil.ObjectCarriage c = LengthValueBytesSerialiserUtil.deserialiseNextObject(getKeySerialiser(), carriage, bytes); LengthValueBytesSerialiserUtil.ObjectCarriage c2 = LengthValueBytesSerialiserUtil.deserialiseNextObject(getValueSerialiser(), c.getCarriage(), bytes); map.put(c.getObject(), c2.getObject()); carriage = c2.getCarriage(); } return map; }
@Override public byte[] serialise(final Map<? extends Object, ? extends Object> object) throws SerialisationException { LengthValueBytesSerialiserUtil.LengthValueBuilder builder = new LengthValueBytesSerialiserUtil.LengthValueBuilder(); try { for (final Map.Entry entry : object.entrySet()) { builder.appendLengthValueFromObjectToByteStream(getKeySerialiser(), entry.getKey()); builder.appendLengthValueFromObjectToByteStream(getValueSerialiser(), entry.getValue()); } } catch (final IOException e) { throw new SerialisationException(e.getMessage(), e); } return builder.toArray(); }
@Test public void mapSerialiserTest() throws SerialisationException { Map<Integer, Integer> map = new LinkedHashMap<>(); map.put(1, 3); map.put(2, 7); map.put(3, 11); ((MapSerialiser) serialiser).setKeySerialiser(new IntegerSerialiser()); ((MapSerialiser) serialiser).setValueSerialiser(new IntegerSerialiser()); ((MapSerialiser) serialiser).setMapClass(LinkedHashMap.class); byte[] b = serialiser.serialise(map); Map o = serialiser.deserialise(b); assertEquals(LinkedHashMap.class, o.getClass()); assertEquals(3, o.size()); assertEquals(3, o.get(1)); assertEquals(7, o.get(2)); assertEquals(11, o.get(3)); }
@Override public byte[] serialise(final Map<? extends Object, ? extends Object> object) throws SerialisationException { LengthValueBytesSerialiserUtil.LengthValueBuilder builder = new LengthValueBytesSerialiserUtil.LengthValueBuilder(); try { for (final Map.Entry entry : object.entrySet()) { builder.appendLengthValueFromObjectToByteStream(getKeySerialiser(), entry.getKey()); builder.appendLengthValueFromObjectToByteStream(getValueSerialiser(), entry.getValue()); } } catch (final IOException e) { throw new SerialisationException(e.getMessage(), e); } return builder.toArray(); }
@Override public Map<? extends Object, ? extends Object> deserialise(final byte[] bytes) throws SerialisationException { Map map; if (null == getMapClass()) { map = new HashMap<>(); } else { try { map = getMapClass().newInstance(); } catch (final IllegalAccessException | IllegalArgumentException | SecurityException | InstantiationException e) { throw new SerialisationException("Failed to create map instance" + e.getMessage(), e); } } final int arrayLength = bytes.length; int carriage = 0; while (carriage < arrayLength) { LengthValueBytesSerialiserUtil.ObjectCarriage c = LengthValueBytesSerialiserUtil.deserialiseNextObject(getKeySerialiser(), carriage, bytes); LengthValueBytesSerialiserUtil.ObjectCarriage c2 = LengthValueBytesSerialiserUtil.deserialiseNextObject(getValueSerialiser(), c.getCarriage(), bytes); map.put(c.getObject(), c2.getObject()); carriage = c2.getCarriage(); } return map; }