InputStream JAXB-n át

A múltkor JAXB-vel kellett átvinnem egy InputStream-et is tartalmazó osztályt. Neten nem találtam rá semmi értelmeset, így lásd lentebb az én megoldásom.

Az InputStream szerializálásához egy adapterosztályt írtam, ami bájttömbbé alakítja az InputStream-et, illetve ugyanezt megteszi a másik irányba is. A bájttömböt pedig már tudja a JAXB is kezelni. Ezután már csak a szerializálandó osztály InputStream mezőjét kell a következőképp annotálni:

@XmlJavaTypeAdapter(InputStreamAdapter.class)
private InputStream data;

Az adapterosztály pedig a következő:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.xml.bind.annotation.adapters.XmlAdapter;

/**
 * JAXB Adapterosztály InputStream-ek szerializálásához.
 * 
 * @author palacsint
 */
public class InputStreamAdapter extends XmlAdapter<byte[], InputStream> {

    @Override
    public byte[] marshal(final InputStream inputStream) throws Exception {
        return inputStreamToByteArray(inputStream);
    }

    @Override
    public InputStream unmarshal(byte[] byteArray) throws Exception {
        return new ByteArrayInputStream(byteArray);
    }

    public static byte[] inputStreamToByteArray(final InputStream inputStream) throws IOException {
        final ByteArrayOutputStream out = new ByteArrayOutputStream(4096);
        try {
            final byte[] buffer = new byte[1024];

            int len;
            while ((len = inputStream.read(buffer)) >= 0) {
                out.write(buffer, 0, len);
            }
        } finally {
            inputStream.close();
            out.close();
        }
        return out.toByteArray();
    }
}

Persze ilyenkor a kiolvasás miatt elvész az adat az InputStream-ből.

Tartalom átvétel