Serialization optimization for UUID keys.

Hi Jan,

This is a change from a user who follows my clone of JDBM.  I think it looks like a good change; you might want to consider merging it yourself.

Here is the diff ignoring whitespace changes:

diff --git a/src/main/java/org/apache/jdbm/Serialization.java b/src/main/java/org/apache/jdbm/Serialization.java
index b8fccce..0e1d56a 100644
--- a/src/main/java/org/apache/jdbm/Serialization.java
+++ b/src/main/java/org/apache/jdbm/Serialization.java
@@ -263,6 +263,10 @@ public class Serialization extends SerialClassInfo implements Serializer {
             out.write(DATE);
             out.writeLong(((Date) obj).getTime());
             return;
+        } else if (clazz == UUID.class) {
+            out.write(UUID);
+            serializeUUID(out,(UUID) obj);
+            return;
         } else if (clazz == BTree.class) {
             out.write(BTREE);
             ((BTree) obj).writeExternal(out);
@@ -407,6 +411,12 @@ public class Serialization extends SerialClassInfo implements Serializer {
 
     }
 
+    private void serializeUUID(DataOutput out, UUID uuid) throws IOException
+    {
+    	out.writeLong(uuid.getMostSignificantBits());
+    	out.writeLong(uuid.getLeastSignificantBits());
+    }
+    
     private void serializeMap(int header, DataOutput out, Object obj, FastArrayList objectStack) throws IOException {
         Map l = (Map) obj;
         out.write(header);
@@ -432,7 +442,6 @@ public class Serialization extends SerialClassInfo implements Serializer {
         out.write(b);
     }
 
-
     private void writeLongArray(DataOutput da, long[] obj) throws IOException {
         long max = Long.MIN_VALUE;
         long min = Long.MAX_VALUE;
@@ -824,6 +833,9 @@ public class Serialization extends SerialClassInfo implements Serializer {
             case DATE:
                 ret = new Date(is.readLong());
                 break;
+            case UUID:
+            	ret = deserializeUUID(is);
+            	break;
             case ARRAY_INT_B_255:
                 ret = deserializeArrayIntB255(is);
                 break;
@@ -1068,6 +1080,11 @@ public class Serialization extends SerialClassInfo implements Serializer {
         return ret;
     }
 
+    private UUID deserializeUUID(DataInput is) throws IOException
+    {
+    	return new UUID(is.readLong(), is.readLong());
+    }
+
     private int[] deserializeArrayIntB255(DataInput is) throws IOException {
         int size = is.readUnsignedByte();
         if (size < 0)
diff --git a/src/main/java/org/apache/jdbm/SerializationHeader.java b/src/main/java/org/apache/jdbm/SerializationHeader.java
index e3ec45c..8e86836 100644
--- a/src/main/java/org/apache/jdbm/SerializationHeader.java
+++ b/src/main/java/org/apache/jdbm/SerializationHeader.java
@@ -120,6 +120,7 @@ final class SerializationHeader {
 
     final static int CLASS = 126;
     final static int DATE = 127;
+    final static int UUID = 128;
 
 
     static final int JDBMLINKEDLIST = 159;
diff --git a/src/test/java/org/apache/jdbm/SerializationTest.java b/src/test/java/org/apache/jdbm/SerializationTest.java
index c61f743..57a58e7 100644
--- a/src/test/java/org/apache/jdbm/SerializationTest.java
+++ b/src/test/java/org/apache/jdbm/SerializationTest.java
@@ -399,6 +399,18 @@ public class SerializationTest extends TestCase {
         assertEquals(d, ser.deserialize(ser.serialize(d)));
     }
 
+    public void testUUID() throws IOException, ClassNotFoundException {
+    	//try a bunch of UUIDs.
+    	for(int i = 0; i < 1000;i++)
+    	{
+    		UUID uuid = UUID.randomUUID();
+    		SimpleEntry a = new SimpleEntry(uuid, "11");
+    		byte[] buf = ser.serialize(a);
+    		SimpleEntry b = (SimpleEntry) ser.deserialize(buf);
+    		assertEquals(b, a);
+    	}
+    }
+
 
     public void testLocale() throws Exception{
         assertEquals(Locale.FRANCE, ser.deserialize(ser.serialize(Locale.FRANCE)));