[ONOS-6642] Disable versioned field serializer by default

Change-Id: I63aba4f56fbce786f1b965f7a9c133d17aeb3ad7
diff --git a/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java b/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
index 8217b28..a0cecae 100644
--- a/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
+++ b/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
@@ -190,16 +190,19 @@
         StoreSerializer serializer1 = StoreSerializer.using(KryoNamespace.newBuilder()
                 .register(KryoNamespaces.BASIC)
                 .register(Versioned1.class)
+                .setCompatible(true)
                 .build());
 
         StoreSerializer serializer2 = StoreSerializer.using(KryoNamespace.newBuilder()
                 .register(KryoNamespaces.BASIC)
                 .register(Versioned2.class)
+                .setCompatible(true)
                 .build());
 
         StoreSerializer serializer3 = StoreSerializer.using(KryoNamespace.newBuilder()
                 .register(KryoNamespaces.BASIC)
                 .register(Versioned3.class)
+                .setCompatible(true)
                 .build());
 
         Versioned1 versioned1 = new Versioned1();
diff --git a/utils/misc/src/main/java/org/onlab/util/KryoNamespace.java b/utils/misc/src/main/java/org/onlab/util/KryoNamespace.java
index ed4b066..afd6978 100644
--- a/utils/misc/src/main/java/org/onlab/util/KryoNamespace.java
+++ b/utils/misc/src/main/java/org/onlab/util/KryoNamespace.java
@@ -27,6 +27,7 @@
 import com.esotericsoftware.kryo.pool.KryoPool;
 import com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer;
 import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import org.apache.commons.lang3.tuple.Pair;
 import org.objenesis.strategy.StdInstantiatorStrategy;
@@ -71,14 +72,13 @@
 
     private static final Logger log = getLogger(KryoNamespace.class);
 
-
-
     private final KryoPool pool = new KryoPool.Builder(this)
                                         .softReferences()
                                         .build();
 
     private final ImmutableList<RegistrationBlock> registeredBlocks;
 
+    private final boolean compatible;
     private final boolean registrationRequired;
     private final String friendlyName;
 
@@ -87,11 +87,22 @@
      */
     //@NotThreadSafe
     public static final class Builder {
+        private static final String ISSU_PROPERTY_NAME = "onos.cluster.issu.enabled";
+        private static final boolean DEFAULT_ISSU_ENABLED = false;
+
+        private static final boolean DEFAULT_COMPATIBLE_SERIALIZATION;
+
+        static {
+            String issuEnabled = System.getProperty(ISSU_PROPERTY_NAME);
+            DEFAULT_COMPATIBLE_SERIALIZATION = Strings.isNullOrEmpty(issuEnabled)
+                    ? DEFAULT_ISSU_ENABLED : Boolean.parseBoolean(issuEnabled);
+        }
 
         private int blockHeadId = INITIAL_ID;
         private List<Pair<Class<?>[], Serializer<?>>> types = new ArrayList<>();
         private List<RegistrationBlock> blocks = new ArrayList<>();
         private boolean registrationRequired = true;
+        private boolean compatible = DEFAULT_COMPATIBLE_SERIALIZATION;
 
         /**
          * Builds a {@link KryoNamespace} instance.
@@ -112,7 +123,7 @@
             if (!types.isEmpty()) {
                 blocks.add(new RegistrationBlock(this.blockHeadId, types));
             }
-            return new KryoNamespace(blocks, registrationRequired, friendlyName).populate(1);
+            return new KryoNamespace(blocks, registrationRequired, compatible, friendlyName).populate(1);
         }
 
         /**
@@ -204,6 +215,20 @@
         }
 
         /**
+         * Sets whether backwards/forwards compatible versioned serialization is enabled.
+         * <p>
+         * When compatible serialization is enabled, the {@link CompatibleFieldSerializer} will be set as the
+         * default serializer for types that do not otherwise explicitly specify a serializer.
+         *
+         * @param compatible whether versioned serialization is enabled
+         * @return this
+         */
+        public Builder setCompatible(boolean compatible) {
+            this.compatible = compatible;
+            return this;
+        }
+
+        /**
          * Sets the registrationRequired flag.
          *
          * @param registrationRequired Kryo's registrationRequired flag
@@ -230,14 +255,17 @@
      * Creates a Kryo instance pool.
      *
      * @param registeredTypes types to register
-     * @param registrationRequired
+     * @param registrationRequired whether registration is required
+     * @param compatible whether compatible serialization is enabled
      * @param friendlyName friendly name for the namespace
      */
     private KryoNamespace(final List<RegistrationBlock> registeredTypes,
                           boolean registrationRequired,
+                          boolean compatible,
                           String friendlyName) {
         this.registeredBlocks = ImmutableList.copyOf(registeredTypes);
         this.registrationRequired = registrationRequired;
+        this.compatible = compatible;
         this.friendlyName =  checkNotNull(friendlyName);
     }
 
@@ -422,7 +450,11 @@
         log.trace("Creating Kryo instance for {}", this);
         Kryo kryo = new Kryo();
         kryo.setRegistrationRequired(registrationRequired);
-        kryo.setDefaultSerializer(CompatibleFieldSerializer::new);
+
+        // If compatible serialization is enabled, override the default serializer.
+        if (compatible) {
+            kryo.setDefaultSerializer(CompatibleFieldSerializer::new);
+        }
 
         // TODO rethink whether we want to use StdInstantiatorStrategy
         kryo.setInstantiatorStrategy(