java_gen.PrimitiveSinkUtils: add support for putting nullable Strings, better support for null

Based on a conversation with @rlane, prepend optional entries with a
presence bit + length instead of the null-byte delimitation.
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/PrimitiveSinkUtils.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/PrimitiveSinkUtils.java
index 0f7400e..28eb3a4 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/PrimitiveSinkUtils.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/PrimitiveSinkUtils.java
@@ -16,20 +16,33 @@
 public class PrimitiveSinkUtils {
     private PrimitiveSinkUtils() {}
 
-    /** puts a nullable element into a primitive sink. The entry is terminated by a null byte
-     *  to disambiguate null elements.
+    /** puts a nullable String into a primitive sink. The entry is prepended by a 'presence'
+     *  boolean bit and the string length;
+     *
+     *
+     * @param sink the sink to put the object
+     * @param nullableObj the potentially null string to put in the sink
+     */
+    public static void putNullableStringTo(PrimitiveSink sink,
+            @Nullable CharSequence nullableChars) {
+
+        sink.putBoolean(nullableChars != null);
+        if(nullableChars != null) {
+            sink.putInt(nullableChars.length());
+            sink.putUnencodedChars(nullableChars);
+        }
+    }
+
+    /** puts a nullable element into a primitive sink. The entry is prepended by a 'present' bit.
      *
      * @param sink the sink to put the object
      * @param nullableObj the nullable object
      */
     public static void putNullableTo(PrimitiveSink sink,
             @Nullable PrimitiveSinkable nullableObj) {
+        sink.putBoolean(nullableObj != null);
         if(nullableObj != null)
             nullableObj.putTo(sink);
-
-        // terminate this object representation by a null byte. this ensures that we get
-        // unique digests even if some values are null
-        sink.putByte((byte) 0);
     }
 
     /** puts the elements of a sorted set into the {@link PrimitiveSink}. Does not support null
@@ -40,6 +53,7 @@
      */
     public static void putSortedSetTo(PrimitiveSink sink,
             SortedSet<? extends PrimitiveSinkable> set) {
+        sink.putInt(set.size());
         for(PrimitiveSinkable e: set) {
             e.putTo(sink);
         }
@@ -53,6 +67,7 @@
      */
     public static void putListTo(PrimitiveSink sink,
             List<? extends PrimitiveSinkable> set) {
+        sink.putInt(set.size());
         for(PrimitiveSinkable e: set) {
             e.putTo(sink);
         }