import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.Map;

import com.caucho.hessian.io.Hessian2Input;
import com.caucho.hessian.io.Hessian2Output;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;

public class HessianTest implements Serializable {

	private final Map<String, String> map;
	private final HessianTest test;

	private HessianTest(Map<String, String> map, HessianTest test) {
		this.map = map;
		this.test = test;
	}

	public static void main(String[] args) throws IOException {

		Map<String, HessianTest> map = Maps.newHashMap();
		HessianTest lastTest = null;
		//seems to start failing when limit set to 18
		for (int i = 0; i < 18; i++) {
			HessianTest test = new HessianTest(ImmutableMap.of("id" + i, "id" + i), lastTest);
			//following line works fine - probably indicating
			//that the issue is with the google collection
			//serialization routine
			//HessianTest test = new HessianTest(Collections.singletonMap("id" + i, "id" + i), lastTest);
			map.put("id" + i, test);
			lastTest = test;
		}

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		Hessian2Output oos = new Hessian2Output(baos);

		oos.writeObject(map);
		oos.close();
		baos.close();

		byte[] input = baos.toByteArray();

		ByteArrayInputStream bais = new ByteArrayInputStream(input);
		Hessian2Input ois = new Hessian2Input(bais);

		ois.readObject();

	}

	private static final long serialVersionUID = 1L;

}
