package com.github.czyzby.websocket.serialization.impl; import java.io.UnsupportedEncodingException; import com.badlogic.gdx.utils.Base64Coder; import com.github.czyzby.websocket.serialization.SerializationException; import com.github.czyzby.websocket.serialization.Serializer; /** Wraps around an existing {@link Serializer} to provide BASE64 encoding and decoding. Uses LibGDX {@link Base64Coder} * API. * * @author MJ */ public class Base64Serializer implements Serializer { private final Serializer serializer; private boolean useUrlSafeEncoding; public Base64Serializer(final Serializer serializer) { this.serializer = serializer; } /** @return wrapped serializer used for actual object (de)serializing. */ public Serializer getSerializer() { return serializer; } @Override public String serializeAsString(final Object object) { final String serialized = serializer.serializeAsString(object); try { return Base64Coder.encodeString(serialized, useUrlSafeEncoding); } catch (final Exception exception) { throw new SerializationException("Unable to encode data into BASE64: " + serialized, exception); } } @Override public byte[] serialize(final Object object) { final byte[] serialized = serializer.serialize(object); try { return Base64Coder.encodeString(new String(serialized, "UTF-8"), useUrlSafeEncoding).getBytes("UTF-8"); } catch (final UnsupportedEncodingException exception) { throw new SerializationException("Unexpected: UTF-8 format not supported.", exception); } catch (final Exception exception) { throw new SerializationException("Unable to encode data into BASE64.", exception); } } @Override public Object deserialize(final String data) { String decoded; try { decoded = Base64Coder.decodeString(data, useUrlSafeEncoding); } catch (final Exception exception) { throw new SerializationException("Unable to decode data from BASE64: " + data, exception); } return serializer.deserialize(decoded); } @Override public Object deserialize(final byte[] data) { String decoded; try { decoded = Base64Coder.decodeString(new String(data, "UTF-8"), useUrlSafeEncoding); } catch (final UnsupportedEncodingException exception) { throw new SerializationException("Unexpected: UTF-8 format not supported.", exception); } catch (final Exception exception) { throw new SerializationException("Unable to decode data from BASE64: " + data, exception); } return serializer.deserialize(decoded); } /** @param useUrlSafeEncoding if true, encoded data will be URL-safe. * @see Base64Coder#encodeString(String, boolean) * @see Base64Coder#decodeString(String, boolean) */ public void setUseUrlSafeEncoding(final boolean useUrlSafeEncoding) { this.useUrlSafeEncoding = useUrlSafeEncoding; } }