Added Kryo factory class.
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/KryoFactory.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/KryoFactory.java
new file mode 100644
index 0000000..405a3ee
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/KryoFactory.java
@@ -0,0 +1,122 @@
+package net.onrc.onos.ofcontroller.util.serializers;
+
+import java.util.ArrayList;
+import com.esotericsoftware.kryo2.Kryo;
+import net.onrc.onos.ofcontroller.util.*;
+
+import net.floodlightcontroller.util.MACAddress;
+
+/**
+ * Class factory for allocating Kryo instances for
+ * serialization/deserialization of classes.
+ */
+public class KryoFactory {
+    private ArrayList<Kryo> kryoList = new ArrayList<Kryo>();
+
+    /**
+     * Default constructor.
+     */
+    public KryoFactory() {
+	Kryo kryo;
+	// Preallocate
+	for (int i = 0; i < 100; i++) {
+	    kryo = newKryoImpl();
+	    kryoList.add(kryo);
+	}
+    }
+
+    /**
+     * Create and initialize a new Kryo object.
+     *
+     * @return the created Kryo object.
+     */
+    public Kryo newKryo() {
+	return newDeleteKryo(null);
+    }
+
+    /**
+     * Delete an existing Kryo object.
+     *
+     * @param deleteKryo the object to delete.
+     */
+    public void deleteKryo(Kryo deleteKryo) {
+	newDeleteKryo(deleteKryo);
+    }
+
+    /**
+     * Create or delete a Kryo object.
+     *
+     * @param deleteKryo if null, then allocate and return a new object,
+     * otherwise delete the provided object.
+     * @return a new Kryo object if needed, otherwise null.
+     */
+    synchronized private Kryo newDeleteKryo(Kryo deleteKryo) {
+	if (deleteKryo != null) {
+	    // Delete an entry by moving it back to the buffer
+	    kryoList.add(deleteKryo);
+	    return null;
+	} else {
+	    Kryo kryo = null;
+	    if (kryoList.isEmpty()) {
+		// Preallocate
+		for (int i = 0; i < 100; i++) {
+		    kryo = newKryoImpl();
+		    kryoList.add(kryo);
+		}
+	    }
+
+	    kryo = kryoList.remove(kryoList.size() - 1);
+	    return kryo;
+	}
+    }
+
+    /**
+     * Create and initialize a new Kryo object.
+     *
+     * @return the created Kryo object.
+     */
+    private Kryo newKryoImpl() {
+	Kryo kryo = new Kryo();
+	kryo.setRegistrationRequired(true);
+	// kryo.setReferences(false);
+	//
+	kryo.register(ArrayList.class);
+	kryo.register(CallerId.class);
+	kryo.register(DataPath.class);
+	kryo.register(DataPathEndpoints.class);
+	kryo.register(Dpid.class);
+	kryo.register(FlowEntryAction.class);
+	kryo.register(FlowEntryAction.ActionEnqueue.class);
+	kryo.register(FlowEntryAction.ActionOutput.class);
+	kryo.register(FlowEntryAction.ActionSetEthernetAddr.class);
+	kryo.register(FlowEntryAction.ActionSetIpToS.class);
+	kryo.register(FlowEntryAction.ActionSetIPv4Addr.class);
+	kryo.register(FlowEntryAction.ActionSetTcpUdpPort.class);
+	kryo.register(FlowEntryAction.ActionSetVlanId.class);
+	kryo.register(FlowEntryAction.ActionSetVlanPriority.class);
+	kryo.register(FlowEntryAction.ActionStripVlan.class);
+	kryo.register(FlowEntryAction.ActionValues.class);
+	kryo.register(FlowEntryActions.class);
+	kryo.register(FlowEntryErrorState.class);
+	kryo.register(FlowEntryId.class);
+	kryo.register(FlowEntry.class);
+	kryo.register(FlowEntryMatch.class);
+	kryo.register(FlowEntryMatch.Field.class);
+	kryo.register(FlowEntrySwitchState.class);
+	kryo.register(FlowEntryUserState.class);
+	kryo.register(FlowId.class);
+	kryo.register(FlowPath.class);
+	kryo.register(FlowPathFlags.class);
+	kryo.register(IPv4.class);
+	kryo.register(IPv4Net.class);
+	kryo.register(IPv6.class);
+	kryo.register(IPv6Net.class);
+	kryo.register(byte[].class);
+	kryo.register(MACAddress.class);
+	kryo.register(Port.class);
+	kryo.register(Switch.class);
+	kryo.register(SwitchPort.class);
+
+	return kryo;
+    }
+}