/** * Encodes the ending of an array. This method writes out {@code 0} to signal the end of the array. * Sub-class can override this to have different behavior * * @param encoder The encoder to use * @param elementSchema The {@link Schema} of the array element * @param size Number of array elements * @throws IOException If failed to encode */ protected void encodeArrayEnd(Encoder encoder, Schema elementSchema, int size) throws IOException { encoder.writeInt(0); }
@Override protected void writeString(Encoder encoder, String val) throws IOException { encoder.writeString(val); }
@Override public Encoder writeBool(boolean b) throws IOException { return encoder.writeBool(b); }
switch (schema.getType()) { case NULL: encoder.writeNull(); break; case BOOLEAN: encoder.writeBool((Boolean) value); break; case INT: encoder.writeInt((Integer) value); break; case LONG: encoder.writeLong((Long) value); break; case FLOAT: encoder.writeFloat((Float) value); break; case DOUBLE: encoder.writeDouble((Double) value); break; case BYTES: break; case STRING: encoder.writeString((String) value); break; case ENUM:
/** * Encodes the given {@link StreamEventData} using the {@link Encoder}. * * @param data The data to encode * @param encoder The encoder * @throws IOException If there is any IO error during encoding. */ public static void encode(StreamEventData data, Encoder encoder) throws IOException { // The schema is sorted by name, hence it is {body, header}. // Writes the body encoder.writeBytes(data.getBody()); // Writes the headers Map<String, String> headers = data.getHeaders(); encoder.writeInt(headers.size()); for (Map.Entry<String, String> entry : headers.entrySet()) { String value = entry.getValue(); encoder.writeString(entry.getKey()) .writeInt(value == null ? 1 : 0) .writeString(entry.getValue()); } if (!headers.isEmpty()) { encoder.writeInt(0); } }
/** * Encodes a map. */ static void encodeMap(Map<String, String> map, Encoder encoder) throws IOException { encoder.writeInt(map.size()); for (Map.Entry<String, String> entry : map.entrySet()) { String value = entry.getValue(); encoder.writeString(entry.getKey()) .writeInt(value == null ? 1 : 0) .writeString(entry.getValue()); } if (!map.isEmpty()) { encoder.writeInt(0); } }
@Override public Encoder writeBytes(ByteBuffer bytes) throws IOException { return encoder.writeBytes(bytes); } }
@Override public Encoder writeLong(long l) throws IOException { return encoder.writeLong(l); }
@Override protected void writeFloat(Encoder encoder, Float val) throws IOException { encoder.writeFloat(val); }
@Override public Encoder writeDouble(double d) throws IOException { return encoder.writeDouble(d); }
@Override protected void writeNull(Encoder encoder) throws IOException { encoder.writeNull(); }
switch (schema.getType()) { case NULL: encoder.writeNull(); break; case BOOLEAN: encoder.writeBool((Boolean) value); break; case INT: encoder.writeInt((Integer) value); break; case LONG: encoder.writeLong((Long) value); break; case FLOAT: encoder.writeFloat((Float) value); break; case DOUBLE: encoder.writeDouble((Double) value); break; case BYTES: break; case STRING: encoder.writeString((String) value); break; case ENUM:
public static byte[] serializeHashKeys(Map<String, Integer> hashKeys) throws IOException { // many entries will have no hash keys. Reuse a static value for that if (hashKeys == null || hashKeys.isEmpty()) { return SERIALIZED_EMPTY_HASH_KEYS; } ByteArrayOutputStream bos = new ByteArrayOutputStream(); Encoder encoder = new BinaryEncoder(bos); encoder.writeInt(hashKeys.size()); for (Map.Entry<String, Integer> entry : hashKeys.entrySet()) { encoder.writeString(entry.getKey()).writeInt(entry.getValue()); } encoder.writeInt(0); // per Avro spec, end with a (block of length) zero return bos.toByteArray(); }
@Override public Encoder writeBytes(ByteBuffer bytes) throws IOException { return encoder.writeBytes(bytes); } }
@Override public Encoder writeLong(long l) throws IOException { return encoder.writeLong(l); }
@Override public Encoder writeFloat(float f) throws IOException { return encoder.writeFloat(f); }
@Override protected void writeDouble(Encoder encoder, Double val) throws IOException { encoder.writeDouble(val); }
@Override public Encoder writeNull() throws IOException { return encoder.writeNull(); }
encoder.writeNull(); Assert.assertNull(decoder.readNull()); encoder.writeBool(true); Assert.assertTrue(decoder.readBool()); encoder.writeBool(false); Assert.assertFalse(decoder.readBool()); encoder.writeInt(0); Assert.assertEquals(0, decoder.readInt()); encoder.writeInt(-1); Assert.assertEquals(-1, decoder.readInt()); encoder.writeInt(1234); Assert.assertEquals(1234, decoder.readInt()); encoder.writeInt(-1234); Assert.assertEquals(-1234, decoder.readInt()); encoder.writeInt(Short.MAX_VALUE); Assert.assertEquals(Short.MAX_VALUE, decoder.readInt()); encoder.writeInt(Short.MIN_VALUE); Assert.assertEquals(Short.MIN_VALUE, decoder.readInt()); encoder.writeInt(Integer.MAX_VALUE); Assert.assertEquals(Integer.MAX_VALUE, decoder.readInt()); encoder.writeInt(Integer.MIN_VALUE); Assert.assertEquals(Integer.MIN_VALUE, decoder.readInt()); encoder.writeLong(0); Assert.assertEquals(0, decoder.readLong()); encoder.writeLong(-20); Assert.assertEquals(-20, decoder.readLong());
/** * Encodes the beginning of an array. This method will encode with the size of the array. * Sub-class can override this to have different behavior * * @param encoder The encoder to use * @param elementSchema The {@link Schema} of the array element * @param size Number of array elements * @throws IOException If failed to encode */ protected void encodeArrayBegin(Encoder encoder, Schema elementSchema, int size) throws IOException { encoder.writeInt(size); }