diff options
author | Gary Gregory <garydgregory@gmail.com> | 2020-10-25 10:29:58 -0400 |
---|---|---|
committer | Gary Gregory <garydgregory@gmail.com> | 2020-10-25 10:29:58 -0400 |
commit | 8fbf27a830d79ffee5cd45030da098b4646c9215 (patch) | |
tree | 6bde6bdab12822e9d6fc7dbf7548bacbcf078a5e /src/main/java/org/apache/commons/lang3/SerializationUtils.java | |
parent | faa48f6b6a6f0c1eed73ba0c69891f324f36829e (diff) | |
download | apache-commons-lang-8fbf27a830d79ffee5cd45030da098b4646c9215.tar.gz |
Sort methods.
Diffstat (limited to 'src/main/java/org/apache/commons/lang3/SerializationUtils.java')
-rw-r--r-- | src/main/java/org/apache/commons/lang3/SerializationUtils.java | 274 |
1 files changed, 134 insertions, 140 deletions
diff --git a/src/main/java/org/apache/commons/lang3/SerializationUtils.java b/src/main/java/org/apache/commons/lang3/SerializationUtils.java index ed46f2ab5..8e8ead580 100644 --- a/src/main/java/org/apache/commons/lang3/SerializationUtils.java +++ b/src/main/java/org/apache/commons/lang3/SerializationUtils.java @@ -47,19 +47,76 @@ import java.util.Map; public class SerializationUtils { /** - * <p>SerializationUtils instances should NOT be constructed in standard programming. - * Instead, the class should be used as {@code SerializationUtils.clone(object)}.</p> + * <p>Custom specialization of the standard JDK {@link java.io.ObjectInputStream} + * that uses a custom {@code ClassLoader} to resolve a class. + * If the specified {@code ClassLoader} is not able to resolve the class, + * the context classloader of the current thread will be used. + * This way, the standard deserialization work also in web-application + * containers and application servers, no matter in which of the + * {@code ClassLoader} the particular class that encapsulates + * serialization/deserialization lives. </p> * - * <p>This constructor is public to permit tools that require a JavaBean instance - * to operate.</p> - * @since 2.0 + * <p>For more in-depth information about the problem for which this + * class here is a workaround, see the JIRA issue LANG-626. </p> */ - public SerializationUtils() { - super(); + static class ClassLoaderAwareObjectInputStream extends ObjectInputStream { + private static final Map<String, Class<?>> primitiveTypes = + new HashMap<>(); + + static { + primitiveTypes.put("byte", byte.class); + primitiveTypes.put("short", short.class); + primitiveTypes.put("int", int.class); + primitiveTypes.put("long", long.class); + primitiveTypes.put("float", float.class); + primitiveTypes.put("double", double.class); + primitiveTypes.put("boolean", boolean.class); + primitiveTypes.put("char", char.class); + primitiveTypes.put("void", void.class); + } + + private final ClassLoader classLoader; + + /** + * Constructor. + * @param in The {@code InputStream}. + * @param classLoader classloader to use + * @throws IOException if an I/O error occurs while reading stream header. + * @see java.io.ObjectInputStream + */ + ClassLoaderAwareObjectInputStream(final InputStream in, final ClassLoader classLoader) throws IOException { + super(in); + this.classLoader = classLoader; + } + + /** + * Overridden version that uses the parameterized {@code ClassLoader} or the {@code ClassLoader} + * of the current {@code Thread} to resolve the class. + * @param desc An instance of class {@code ObjectStreamClass}. + * @return A {@code Class} object corresponding to {@code desc}. + * @throws IOException Any of the usual Input/Output exceptions. + * @throws ClassNotFoundException If class of a serialized object cannot be found. + */ + @Override + protected Class<?> resolveClass(final ObjectStreamClass desc) throws IOException, ClassNotFoundException { + final String name = desc.getName(); + try { + return Class.forName(name, false, classLoader); + } catch (final ClassNotFoundException ex) { + try { + return Class.forName(name, false, Thread.currentThread().getContextClassLoader()); + } catch (final ClassNotFoundException cnfe) { + final Class<?> cls = primitiveTypes.get(name); + if (cls != null) { + return cls; + } + throw cnfe; + } + } + } + } - // Clone - //----------------------------------------------------------------------- /** * <p>Deep clone an {@code Object} using serialization.</p> * @@ -100,63 +157,28 @@ public class SerializationUtils { } /** - * Performs a serialization roundtrip. Serializes and deserializes the given object, great for testing objects that - * implement {@link Serializable}. - * - * @param <T> - * the type of the object involved - * @param msg - * the object to roundtrip - * @return the serialized and deserialized object - * @since 3.3 - */ - @SuppressWarnings("unchecked") // OK, because we serialized a type `T` - public static <T extends Serializable> T roundtrip(final T msg) { - return (T) deserialize(serialize(msg)); - } - - // Serialize - //----------------------------------------------------------------------- - /** - * <p>Serializes an {@code Object} to the specified stream.</p> - * - * <p>The stream will be closed once the object is written. - * This avoids the need for a finally clause, and maybe also exception - * handling, in the application code.</p> - * - * <p>The stream passed in is not buffered internally within this method. - * This is the responsibility of your application if desired.</p> + * <p> + * Deserializes a single {@code Object} from an array of bytes. + * </p> * - * @param obj the object to serialize to bytes, may be null - * @param outputStream the stream to write to, must not be null - * @throws NullPointerException if {@code outputStream} is {@code null} - * @throws SerializationException (runtime) if the serialization fails - */ - public static void serialize(final Serializable obj, final OutputStream outputStream) { - Validate.notNull(outputStream, "The OutputStream must not be null"); - try (ObjectOutputStream out = new ObjectOutputStream(outputStream)) { - out.writeObject(obj); - } catch (final IOException ex) { - throw new SerializationException(ex); - } - } - - /** - * <p>Serializes an {@code Object} to a byte array for - * storage/serialization.</p> + * <p> + * If the call site incorrectly types the return value, a {@link ClassCastException} is thrown from the call site. + * Without Generics in this declaration, the call site must type cast and can cause the same ClassCastException. + * Note that in both cases, the ClassCastException is in the call site, not in this method. + * </p> * - * @param obj the object to serialize to bytes - * @return a byte[] with the converted Serializable + * @param <T> the object type to be deserialized + * @param objectData + * the serialized object, must not be null + * @return the deserialized object + * @throws NullPointerException if {@code objectData} is {@code null} * @throws SerializationException (runtime) if the serialization fails */ - public static byte[] serialize(final Serializable obj) { - final ByteArrayOutputStream baos = new ByteArrayOutputStream(512); - serialize(obj, baos); - return baos.toByteArray(); + public static <T> T deserialize(final byte[] objectData) { + Validate.notNull(objectData, "The byte[] must not be null"); + return deserialize(new ByteArrayInputStream(objectData)); } - // Deserialize - //----------------------------------------------------------------------- /** * <p> * Deserializes an {@code Object} from the specified stream. @@ -197,97 +219,69 @@ public class SerializationUtils { } /** - * <p> - * Deserializes a single {@code Object} from an array of bytes. - * </p> + * Performs a serialization roundtrip. Serializes and deserializes the given object, great for testing objects that + * implement {@link Serializable}. * - * <p> - * If the call site incorrectly types the return value, a {@link ClassCastException} is thrown from the call site. - * Without Generics in this declaration, the call site must type cast and can cause the same ClassCastException. - * Note that in both cases, the ClassCastException is in the call site, not in this method. - * </p> + * @param <T> + * the type of the object involved + * @param msg + * the object to roundtrip + * @return the serialized and deserialized object + * @since 3.3 + */ + @SuppressWarnings("unchecked") // OK, because we serialized a type `T` + public static <T extends Serializable> T roundtrip(final T msg) { + return (T) deserialize(serialize(msg)); + } + + /** + * <p>Serializes an {@code Object} to a byte array for + * storage/serialization.</p> * - * @param <T> the object type to be deserialized - * @param objectData - * the serialized object, must not be null - * @return the deserialized object - * @throws NullPointerException if {@code objectData} is {@code null} + * @param obj the object to serialize to bytes + * @return a byte[] with the converted Serializable * @throws SerializationException (runtime) if the serialization fails */ - public static <T> T deserialize(final byte[] objectData) { - Validate.notNull(objectData, "The byte[] must not be null"); - return deserialize(new ByteArrayInputStream(objectData)); + public static byte[] serialize(final Serializable obj) { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(512); + serialize(obj, baos); + return baos.toByteArray(); } /** - * <p>Custom specialization of the standard JDK {@link java.io.ObjectInputStream} - * that uses a custom {@code ClassLoader} to resolve a class. - * If the specified {@code ClassLoader} is not able to resolve the class, - * the context classloader of the current thread will be used. - * This way, the standard deserialization work also in web-application - * containers and application servers, no matter in which of the - * {@code ClassLoader} the particular class that encapsulates - * serialization/deserialization lives. </p> + * <p>Serializes an {@code Object} to the specified stream.</p> * - * <p>For more in-depth information about the problem for which this - * class here is a workaround, see the JIRA issue LANG-626. </p> + * <p>The stream will be closed once the object is written. + * This avoids the need for a finally clause, and maybe also exception + * handling, in the application code.</p> + * + * <p>The stream passed in is not buffered internally within this method. + * This is the responsibility of your application if desired.</p> + * + * @param obj the object to serialize to bytes, may be null + * @param outputStream the stream to write to, must not be null + * @throws NullPointerException if {@code outputStream} is {@code null} + * @throws SerializationException (runtime) if the serialization fails */ - static class ClassLoaderAwareObjectInputStream extends ObjectInputStream { - private static final Map<String, Class<?>> primitiveTypes = - new HashMap<>(); - - static { - primitiveTypes.put("byte", byte.class); - primitiveTypes.put("short", short.class); - primitiveTypes.put("int", int.class); - primitiveTypes.put("long", long.class); - primitiveTypes.put("float", float.class); - primitiveTypes.put("double", double.class); - primitiveTypes.put("boolean", boolean.class); - primitiveTypes.put("char", char.class); - primitiveTypes.put("void", void.class); - } - - private final ClassLoader classLoader; - - /** - * Constructor. - * @param in The {@code InputStream}. - * @param classLoader classloader to use - * @throws IOException if an I/O error occurs while reading stream header. - * @see java.io.ObjectInputStream - */ - ClassLoaderAwareObjectInputStream(final InputStream in, final ClassLoader classLoader) throws IOException { - super(in); - this.classLoader = classLoader; - } - - /** - * Overridden version that uses the parameterized {@code ClassLoader} or the {@code ClassLoader} - * of the current {@code Thread} to resolve the class. - * @param desc An instance of class {@code ObjectStreamClass}. - * @return A {@code Class} object corresponding to {@code desc}. - * @throws IOException Any of the usual Input/Output exceptions. - * @throws ClassNotFoundException If class of a serialized object cannot be found. - */ - @Override - protected Class<?> resolveClass(final ObjectStreamClass desc) throws IOException, ClassNotFoundException { - final String name = desc.getName(); - try { - return Class.forName(name, false, classLoader); - } catch (final ClassNotFoundException ex) { - try { - return Class.forName(name, false, Thread.currentThread().getContextClassLoader()); - } catch (final ClassNotFoundException cnfe) { - final Class<?> cls = primitiveTypes.get(name); - if (cls != null) { - return cls; - } - throw cnfe; - } - } + public static void serialize(final Serializable obj, final OutputStream outputStream) { + Validate.notNull(outputStream, "The OutputStream must not be null"); + try (ObjectOutputStream out = new ObjectOutputStream(outputStream)) { + out.writeObject(obj); + } catch (final IOException ex) { + throw new SerializationException(ex); } + } + /** + * <p>SerializationUtils instances should NOT be constructed in standard programming. + * Instead, the class should be used as {@code SerializationUtils.clone(object)}.</p> + * + * <p>This constructor is public to permit tools that require a JavaBean instance + * to operate.</p> + * @since 2.0 + */ + public SerializationUtils() { + super(); } } |