src/java.base/share/classes/java/io/ObjectStreamClass.java

Print this page

        

@@ -1250,10 +1250,14 @@
      */
     void getObjFieldValues(Object obj, Object[] vals) {
         fieldRefl.getObjFieldValues(obj, vals);
     }
 
+    void checkObjFieldValueTypes(Object obj, Object[] vals) {
+        fieldRefl.checkObjectFieldValueTypes(obj, vals);
+    }
+
     /**
      * Sets the serializable object fields of object obj using values from
      * array vals starting at offset 0.  It is the responsibility of the caller
      * to ensure that obj is of the proper type if non-null.
      */

@@ -2067,18 +2071,26 @@
                         throw new InternalError();
                 }
             }
         }
 
+        void checkObjectFieldValueTypes(Object obj, Object[] vals) {
+            setObjFieldValues(obj, vals, true);
+        }
+
         /**
          * Sets the serializable object fields of object obj using values from
          * array vals starting at offset 0.  The caller is responsible for
          * ensuring that obj is of the proper type; however, attempts to set a
          * field with a value of the wrong type will trigger an appropriate
          * ClassCastException.
          */
         void setObjFieldValues(Object obj, Object[] vals) {
+            setObjFieldValues(obj, vals, false);
+        }
+
+        private void setObjFieldValues(Object obj, Object[] vals, boolean dryRun) {
             if (obj == null) {
                 throw new NullPointerException();
             }
             for (int i = numPrimFields; i < fields.length; i++) {
                 long key = writeKeys[i];

@@ -2099,10 +2111,11 @@
                                 f.getDeclaringClass().getName() + "." +
                                 f.getName() + " of type " +
                                 f.getType().getName() + " in instance of " +
                                 obj.getClass().getName());
                         }
+                        if (!dryRun)
                         unsafe.putObject(obj, key, val);
                         break;
 
                     default:
                         throw new InternalError();