/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.testsupport.serialization;
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.search.testsupport.serialization.SerializationTestHelper.Foo.TestInnerClass;
import org.junit.Test;
/**
* @author Sanne Grinovero
*/
public class SerializationTestHelper {
/**
* Duplicates an object using Serialization, it moves
* state to and from a buffer. Should be used to test
* correct serializability.
* @param o The object to "clone"
* @return the clone.
* @throws IOException
* @throws ClassNotFoundException
*/
public static <T> T duplicateBySerialization(T o) throws IOException, ClassNotFoundException {
// Serialize to buffer:
java.io.ByteArrayOutputStream outStream = new java.io.ByteArrayOutputStream();
ObjectOutputStream objectOutStream = new ObjectOutputStream( outStream );
objectOutStream.writeObject( o );
objectOutStream.flush();
objectOutStream.close();
// buffer version of Object:
byte[] objectBuffer = outStream.toByteArray();
// deserialize to new instance:
java.io.ByteArrayInputStream inStream = new ByteArrayInputStream( objectBuffer );
ObjectInputStream objectInStream = new ObjectInputStream( inStream );
T copy = (T) objectInStream.readObject();
return copy;
}
@Test
public void testSelf() throws IOException, ClassNotFoundException {
Foo a = new Foo();
a.list.add( new TestInnerClass( 30 ) );
Foo b = (Foo) duplicateBySerialization( a );
assertEquals( Integer.valueOf( 6 ), a.integer );
assertEquals( Integer.valueOf( 7 ), b.integer );
assertEquals( a.list, b.list );
}
static class Foo implements Serializable {
List<TestInnerClass> list = new ArrayList<TestInnerClass>();
transient Integer integer = Integer.valueOf( 6 );
static class TestInnerClass implements Serializable {
private final int v;
public TestInnerClass(int i) {
v = i;
}
public void print() {
System.out.println( v );
}
@Override
public String toString() {
return "" + v;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + v;
return result;
}
@Override
public boolean equals(Object obj) {
if ( this == obj ) {
return true;
}
if ( obj == null ) {
return false;
}
if ( getClass() != obj.getClass() ) {
return false;
}
final TestInnerClass other = (TestInnerClass) obj;
if ( v != other.v ) {
return false;
}
return true;
}
}
private void readObject(ObjectInputStream aInputStream) throws ClassNotFoundException, IOException {
aInputStream.defaultReadObject();
integer = Integer.valueOf( 7 );
}
private void writeObject(ObjectOutputStream aOutputStream) throws IOException {
aOutputStream.defaultWriteObject();
}
}
}