Adds helpers to Serializable for J2CL.

Change-Id: I6931a2ef62e8e7c0939bb7da3f31f1655fb5067f
diff --git a/dev/core/test/com/google/gwt/dev/CompilerTest.java b/dev/core/test/com/google/gwt/dev/CompilerTest.java
index 2883ded..88fce34 100644
--- a/dev/core/test/com/google/gwt/dev/CompilerTest.java
+++ b/dev/core/test/com/google/gwt/dev/CompilerTest.java
@@ -2746,6 +2746,8 @@
     // always traversed fully and polute the tests, so they will be removed from stale type
     // comparisons.
     staleTypeNames.removeAll(Arrays.asList(
+        "java.io.HasSerializableTypeMarker",
+        "java.io.Serializable",
         "java.lang.Boolean",
         "java.lang.CharSequence",
         "java.lang.Comparable",
diff --git a/user/super/com/google/gwt/emul/java/io/HasSerializableTypeMarker.java b/user/super/com/google/gwt/emul/java/io/HasSerializableTypeMarker.java
new file mode 100644
index 0000000..9de7ab1
--- /dev/null
+++ b/user/super/com/google/gwt/emul/java/io/HasSerializableTypeMarker.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package java.io;
+
+import jsinterop.annotations.JsPackage;
+import jsinterop.annotations.JsProperty;
+import jsinterop.annotations.JsType;
+
+@JsType(isNative = true, name = "*", namespace = JsPackage.GLOBAL)
+interface HasSerializableTypeMarker {
+  @JsProperty(name = "$implements__java_io_Serializable")
+  boolean getTypeMarker();
+}
diff --git a/user/super/com/google/gwt/emul/java/io/Serializable.java b/user/super/com/google/gwt/emul/java/io/Serializable.java
index 72e5f30..f47aa5d 100644
--- a/user/super/com/google/gwt/emul/java/io/Serializable.java
+++ b/user/super/com/google/gwt/emul/java/io/Serializable.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2007 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,28 @@
  */
 package java.io;
 
+import javaemul.internal.JsUtils;
+import jsinterop.annotations.JsMethod;
+
 /**
  * Provided for interoperability; RPC treats this interface synonymously with
  * {@link com.google.gwt.user.client.rpc.IsSerializable IsSerializable}.
  * The Java serialization protocol is explicitly not supported.
  */
 public interface Serializable {
+  // CHECKSTYLE_OFF: Utility methods.
+  @JsMethod
+  static boolean $isInstance(HasSerializableTypeMarker instance) {
+    if (instance == null) {
+      return false;
+    }
+
+    String type = JsUtils.typeOf(instance);
+    return type.equals("boolean")
+        || type.equals("number")
+        || type.equals("string")
+        || instance.getTypeMarker()
+        || instance.getClass().isArray();
+  }
+  // CHECKSTYLE_ON: end utility methods
 }