1 package xuml.tools.model.compiler.runtime;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.ByteArrayOutputStream;
5
6 import org.objenesis.strategy.StdInstantiatorStrategy;
7
8 import com.esotericsoftware.kryo.Kryo;
9 import com.esotericsoftware.kryo.io.Input;
10 import com.esotericsoftware.kryo.io.Output;
11 import com.esotericsoftware.kryo.util.DefaultInstantiatorStrategy;
12 import com.esotericsoftware.kryo.util.Pool;
13
14 public class Util {
15
16 private static final Pool<Kryo> pool = createKryoPool();
17
18 public static byte[] toBytes(Object object) {
19 if (object == null)
20 return new byte[] {};
21 Kryo kryo = pool.obtain();
22 try {
23 ByteArrayOutputStream bytes = new ByteArrayOutputStream();
24 Output output = new Output(bytes);
25 try {
26 kryo.writeObject(output, object);
27 } finally {
28 output.close();
29 }
30 return bytes.toByteArray();
31 } finally {
32 pool.free(kryo);
33 }
34 }
35
36 public static <T> T toObject(byte[] bytes, Class<T> cls) {
37 if (bytes.length == 0)
38 return null;
39 ByteArrayInputStream in = new ByteArrayInputStream(bytes);
40 Kryo kryo = pool.obtain();
41 try {
42 Input input = new Input(in);
43 try {
44 return kryo.readObject(input, cls);
45 } finally {
46 input.close();
47 }
48 } finally {
49 pool.free(kryo);
50 }
51 }
52
53 private static Pool<Kryo> createKryoPool() {
54 return new Pool<Kryo>(true, true, 8) {
55 @Override
56 public Kryo create() {
57 Kryo kryo = new Kryo();
58 kryo.setRegistrationRequired(false);
59 kryo.setInstantiatorStrategy(
60 new DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));
61
62 return kryo;
63 }
64 };
65 }
66
67 }