swingx-master/swingx-testsupport/src/main/java/org/jdesktop/test/SerializableSupport.java
/*
 * Created on 24.08.2006
 *
 */
package org.jdesktop.test;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * Support class to test serializable behaviour.
 * 
 *  @author <a href="mailto:jesse@swank.ca">Jesse Wilson</a>
 */
public final class SerializableSupport {
    private SerializableSupport() {
        //prevent instantiation
    }
    
    /**
     * Serialize the specified object to bytes, then deserialize it back.
     */
    @SuppressWarnings("unchecked")
    public static <T> T serialize(T object) {
        try {
            return (T) fromBytes(toBytes(object));
        } catch (ClassNotFoundException shouldNeverHappen) {
            throw new Error(shouldNeverHappen);
        } catch (IOException shouldNeverHappen) {
            throw new Error(shouldNeverHappen);
        }
    }

    private static byte[] toBytes(Object object) throws IOException {
        ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
        ObjectOutputStream objectsOut = new ObjectOutputStream(bytesOut);
        objectsOut.writeObject(object);
        return bytesOut.toByteArray();
    }

    private static Object fromBytes(byte[] bytes) throws IOException, ClassNotFoundException {
        ByteArrayInputStream bytesIn = new ByteArrayInputStream(bytes);
        ObjectInputStream objectsIn = new ObjectInputStream(bytesIn);
        return objectsIn.readObject();
    }

    /**
     * Encodes an object as XML and then decodes it.
     * 
     * @param <T>
     *            the type to operate on
     * @param object
     *            the object to encode/decode
     * @return a copy of the original object that was encoded and decoded
     * @see XMLEncoder
     * @see XMLDecoder
     */
    @SuppressWarnings("unchecked")
    public static <T> T encode(T object) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        XMLEncoder encoder = new XMLEncoder(baos);
        encoder.writeObject(object);
        encoder.close();
        
        XMLDecoder decoder = new XMLDecoder(new ByteArrayInputStream(baos.toByteArray()));
        T copy = (T) decoder.readObject();
        decoder.close();
        
        return copy;
    }
}
