aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/apache/commons/lang3/SerializationUtils.java
diff options
context:
space:
mode:
authorGary Gregory <garydgregory@gmail.com>2020-10-25 10:29:58 -0400
committerGary Gregory <garydgregory@gmail.com>2020-10-25 10:29:58 -0400
commit8fbf27a830d79ffee5cd45030da098b4646c9215 (patch)
tree6bde6bdab12822e9d6fc7dbf7548bacbcf078a5e /src/main/java/org/apache/commons/lang3/SerializationUtils.java
parentfaa48f6b6a6f0c1eed73ba0c69891f324f36829e (diff)
downloadapache-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.java274
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();
}
}