(De-)Serialisation von Objekten in einen String (Base64 encoded)

Da es in Java keine direkte Möglichkeit gibt Binärdaten in einen String zu schreiben, kann man hierzu auf die Apache Commons Bibliothek codec zurück greifen.

Diese bietet unteranderem auch eine BASE64-Konvertierung an, die die Datenmenge zwar um ca. 33% größer werden, dann aber problemlos als Zeichenkette weiterverarbeiten lässt.

Im folgenden Beispiel wird ein konkreter Anwendungsfall gezeigt, im dem ein Objekt der Klasse SerienTerminForm mittels ObjectOutputStream serialisiert wird, bevor aus den BASE64-kodierten Daten ein neuer String erzeugt wird.

Natürlich lässt sich die Objekt-Serialisierung auch auf jede andere Klasse anpassen, die die Schnittstelle Serializable implementiert.

        /**
         * @param form
         *            the form data to serialize
         * @return the serialized string (Base64 encoded)
         */
        public static String serializeInfo(final SerienTerminForm form) {
            try {
                final ByteArrayOutputStream baos = new ByteArrayOutputStream();
                final ObjectOutputStream oos = new ObjectOutputStream(baos);
                oos.writeObject(form);
                final String info = new String(new Base64().encode(baos.toByteArray()));
                return info;
            } catch (Exception e) {
                LOGGER.warn("SerienTerminForm not serializable");
                return null;
            }
        }

Hier nun auch der Rückweg aus den in der Zeichenkette gespeicherten Objektinformationen wieder eine lauffähige Instanz zu machen. In diesem Beispiel werden auftretende Ausnahmen nur abgefangen und geloggt, aber immer eine Objekt-Instanz erzeugt.

        /**
         * @param info
         *            the serialized string (Base64 encoded)
         * @return a {@link SerienTerminForm} instance (<code>null</code>-safe)
         */
        public static SerienTerminForm deserializeInfo(final String info) {
            SerienTerminForm form;
            try {
                byte[] bytes = new Base64().decode(info.getBytes());
                final ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
                form = (SerienTerminForm) ois.readObject();
            } catch (Exception e) {
                LOGGER.warn("SerienTerminForm not deserializable", e);
                form = new SerienTerminForm();
            }
            return form;
        }

Hendrik Lange

Tags: , , , ,

  • Share/Bookmark

Hinterlasse eine Antwort