1 /*
2 * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.io;
27
28 import java.io.ObjectStreamClass.WeakClassKey;
29 import java.lang.ref.ReferenceQueue;
30 import java.lang.reflect.Array;
31 import java.lang.reflect.Modifier;
32 import java.lang.reflect.Proxy;
33 import java.security.AccessControlContext;
34 import java.security.AccessController;
35 import java.security.PrivilegedAction;
36 import java.security.PrivilegedActionException;
37 import java.security.PrivilegedExceptionAction;
38 import java.util.Arrays;
39 import java.util.HashMap;
40 import java.util.concurrent.ConcurrentHashMap;
41 import java.util.concurrent.ConcurrentMap;
42 import static java.io.ObjectStreamClass.processQueue;
43 import jdk.internal.misc.Unsafe;
44 import sun.reflect.misc.ReflectUtil;
45
46 /**
47 * An ObjectInputStream deserializes primitive data and objects previously
48 * written using an ObjectOutputStream.
49 *
50 * <p>ObjectOutputStream and ObjectInputStream can provide an application with
51 * persistent storage for graphs of objects when used with a FileOutputStream
52 * and FileInputStream respectively. ObjectInputStream is used to recover
53 * those objects previously serialized. Other uses include passing objects
54 * between hosts using a socket stream or for marshaling and unmarshaling
55 * arguments and parameters in a remote communication system.
56 *
57 * <p>ObjectInputStream ensures that the types of all objects in the graph
58 * created from the stream match the classes present in the Java Virtual
59 * Machine. Classes are loaded as required using the standard mechanisms.
195 * Similarly, any serialPersistentFields or serialVersionUID field declarations
196 * are also ignored--all enum types have a fixed serialVersionUID of 0L.
197 *
198 * @author Mike Warres
199 * @author Roger Riggs
200 * @see java.io.DataInput
201 * @see java.io.ObjectOutputStream
202 * @see java.io.Serializable
203 * @see <a href="../../../platform/serialization/spec/input.html"> Object Serialization Specification, Section 3, Object Input Classes</a>
204 * @since 1.1
205 */
206 public class ObjectInputStream
207 extends InputStream implements ObjectInput, ObjectStreamConstants
208 {
209 /** handle value representing null */
210 private static final int NULL_HANDLE = -1;
211
212 /** marker for unshared objects in internal handle table */
213 private static final Object unsharedMarker = new Object();
214
215 /** table mapping primitive type names to corresponding class objects */
216 private static final HashMap<String, Class<?>> primClasses
217 = new HashMap<>(8, 1.0F);
218 static {
219 primClasses.put("boolean", boolean.class);
220 primClasses.put("byte", byte.class);
221 primClasses.put("char", char.class);
222 primClasses.put("short", short.class);
223 primClasses.put("int", int.class);
224 primClasses.put("long", long.class);
225 primClasses.put("float", float.class);
226 primClasses.put("double", double.class);
227 primClasses.put("void", void.class);
228 }
229
230 private static class Caches {
231 /** cache of subclass security audit results */
232 static final ConcurrentMap<WeakClassKey,Boolean> subclassAudits =
233 new ConcurrentHashMap<>();
234
235 /** queue for WeakReferences to audited subclasses */
236 static final ReferenceQueue<Class<?>> subclassAuditsQueue =
237 new ReferenceQueue<>();
238 }
239
240 /** filter stream for handling block data conversion */
241 private final BlockDataInputStream bin;
242 /** validation callback list */
243 private final ValidationList vlist;
244 /** recursion depth */
245 private int depth;
246 /** whether stream is closed */
247 private boolean closed;
248
|
1 /*
2 * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.io;
27
28 import java.io.ObjectStreamClass.WeakClassKey;
29 import java.lang.ref.ReferenceQueue;
30 import java.lang.reflect.Array;
31 import java.lang.reflect.Modifier;
32 import java.lang.reflect.Proxy;
33 import java.security.AccessControlContext;
34 import java.security.AccessController;
35 import java.security.PrivilegedAction;
36 import java.security.PrivilegedActionException;
37 import java.security.PrivilegedExceptionAction;
38 import java.util.Arrays;
39 import java.util.Map;
40 import java.util.concurrent.ConcurrentHashMap;
41 import java.util.concurrent.ConcurrentMap;
42 import static java.io.ObjectStreamClass.processQueue;
43 import jdk.internal.misc.Unsafe;
44 import sun.reflect.misc.ReflectUtil;
45
46 /**
47 * An ObjectInputStream deserializes primitive data and objects previously
48 * written using an ObjectOutputStream.
49 *
50 * <p>ObjectOutputStream and ObjectInputStream can provide an application with
51 * persistent storage for graphs of objects when used with a FileOutputStream
52 * and FileInputStream respectively. ObjectInputStream is used to recover
53 * those objects previously serialized. Other uses include passing objects
54 * between hosts using a socket stream or for marshaling and unmarshaling
55 * arguments and parameters in a remote communication system.
56 *
57 * <p>ObjectInputStream ensures that the types of all objects in the graph
58 * created from the stream match the classes present in the Java Virtual
59 * Machine. Classes are loaded as required using the standard mechanisms.
195 * Similarly, any serialPersistentFields or serialVersionUID field declarations
196 * are also ignored--all enum types have a fixed serialVersionUID of 0L.
197 *
198 * @author Mike Warres
199 * @author Roger Riggs
200 * @see java.io.DataInput
201 * @see java.io.ObjectOutputStream
202 * @see java.io.Serializable
203 * @see <a href="../../../platform/serialization/spec/input.html"> Object Serialization Specification, Section 3, Object Input Classes</a>
204 * @since 1.1
205 */
206 public class ObjectInputStream
207 extends InputStream implements ObjectInput, ObjectStreamConstants
208 {
209 /** handle value representing null */
210 private static final int NULL_HANDLE = -1;
211
212 /** marker for unshared objects in internal handle table */
213 private static final Object unsharedMarker = new Object();
214
215 /**
216 * immutable table mapping primitive type names to corresponding
217 * class objects
218 */
219 private static final Map<String, Class<?>> primClasses =
220 Map.of("boolean", boolean.class,
221 "byte", byte.class,
222 "char", char.class,
223 "short", short.class,
224 "int", int.class,
225 "long", long.class,
226 "float", float.class,
227 "double", double.class,
228 "void", void.class);
229
230 private static class Caches {
231 /** cache of subclass security audit results */
232 static final ConcurrentMap<WeakClassKey,Boolean> subclassAudits =
233 new ConcurrentHashMap<>();
234
235 /** queue for WeakReferences to audited subclasses */
236 static final ReferenceQueue<Class<?>> subclassAuditsQueue =
237 new ReferenceQueue<>();
238 }
239
240 /** filter stream for handling block data conversion */
241 private final BlockDataInputStream bin;
242 /** validation callback list */
243 private final ValidationList vlist;
244 /** recursion depth */
245 private int depth;
246 /** whether stream is closed */
247 private boolean closed;
248
|