Author: rmannibucau
Date: Sun May 11 20:06:26 2014
New Revision: 1593847
URL: http://svn.apache.org/r1593847
Log:
deserializer should get a classloader, allowing null for now (=use tccl) to
avoid to rewrite too much
Modified:
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDisk.java
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/indexed/IndexedDisk.java
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/jdbc/JDBCDiskCache.java
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/http/client/RemoteHttpCacheDispatcher.java
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/behavior/IElementSerializer.java
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/CompressingSerializer.java
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/SerializationConversionUtil.java
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/StandardSerializer.java
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCacheUnitTest.java
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/engine/control/MockElementSerializer.java
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/serialization/CompressingSerializerUnitTest.java
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/serialization/StandardSerializerUnitTest.java
commons/proper/jcs/trunk/commons-jcs-jcache/src/main/java/org/apache/commons/jcs/jcache/JCSCache.java
commons/proper/jcs/trunk/commons-jcs-jcache/src/main/java/org/apache/commons/jcs/jcache/serialization/Serializations.java
Modified:
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDisk.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDisk.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDisk.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDisk.java
Sun May 11 20:06:26 2014
@@ -301,7 +301,7 @@ public class BlockDisk
log.debug( "read, total post combination data.length = " +
data.length );
}
- return elementSerializer.deSerialize( data );
+ return elementSerializer.deSerialize( data, null );
}
/**
Modified:
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/indexed/IndexedDisk.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/indexed/IndexedDisk.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/indexed/IndexedDisk.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/indexed/IndexedDisk.java
Sun May 11 20:06:26 2014
@@ -115,7 +115,7 @@ class IndexedDisk
fc.read(data, ded.pos + HEADER_SIZE_BYTES);
data.flip();
- return elementSerializer.deSerialize( data.array() );
+ return elementSerializer.deSerialize( data.array(), null );
}
/**
Modified:
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/jdbc/JDBCDiskCache.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/jdbc/JDBCDiskCache.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/jdbc/JDBCDiskCache.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/jdbc/JDBCDiskCache.java
Sun May 11 20:06:26 2014
@@ -550,7 +550,7 @@ public class JDBCDiskCache<K, V>
try
{
// USE THE SERIALIZER
- obj = getElementSerializer().deSerialize( data
);
+ obj = getElementSerializer().deSerialize(
data, null );
}
catch ( IOException ioe )
{
@@ -654,7 +654,7 @@ public class JDBCDiskCache<K, V>
try
{
// USE THE SERIALIZER
- ICacheElement<K, V> value =
getElementSerializer().deSerialize( data );
+ ICacheElement<K, V> value =
getElementSerializer().deSerialize( data, null );
results.put( (K) key, value );
}
catch ( IOException ioe )
Modified:
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/http/client/RemoteHttpCacheDispatcher.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/http/client/RemoteHttpCacheDispatcher.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/http/client/RemoteHttpCacheDispatcher.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/http/client/RemoteHttpCacheDispatcher.java
Sun May 11 20:06:26 2014
@@ -89,7 +89,7 @@ public class RemoteHttpCacheDispatcher
RemoteCacheResponse<T> remoteCacheResponse = null;
try
{
- remoteCacheResponse = serializer.deSerialize(
responseAsByteArray );
+ remoteCacheResponse = serializer.deSerialize(
responseAsByteArray, null );
}
catch ( ClassNotFoundException e )
{
Modified:
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/behavior/IElementSerializer.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/behavior/IElementSerializer.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/behavior/IElementSerializer.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/behavior/IElementSerializer.java
Sun May 11 20:06:26 2014
@@ -45,6 +45,6 @@ public interface IElementSerializer
* @throws IOException
* @throws ClassNotFoundException thrown if we don't know the object.
*/
- <T> T deSerialize( byte[] bytes )
+ <T> T deSerialize( byte[] bytes, ClassLoader loader )
throws IOException, ClassNotFoundException;
}
Modified:
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/CompressingSerializer.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/CompressingSerializer.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/CompressingSerializer.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/CompressingSerializer.java
Sun May 11 20:06:26 2014
@@ -86,7 +86,7 @@ public class CompressingSerializer
* @throws ClassNotFoundException if class is not found during
deserialization
*/
@Override
- public <T> T deSerialize( byte[] data )
+ public <T> T deSerialize( byte[] data, ClassLoader loader )
throws IOException, ClassNotFoundException
{
if ( data == null )
Modified:
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/SerializationConversionUtil.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/SerializationConversionUtil.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/SerializationConversionUtil.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/SerializationConversionUtil.java
Sun May 11 20:06:26 2014
@@ -120,7 +120,7 @@ public class SerializationConversionUtil
{
try
{
- deSerializedValue = elementSerializer.deSerialize(
serialized.getSerializedValue() );
+ deSerializedValue = elementSerializer.deSerialize(
serialized.getSerializedValue(), null );
}
catch ( ClassNotFoundException e )
{
Modified:
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/StandardSerializer.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/StandardSerializer.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/StandardSerializer.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/serialization/StandardSerializer.java
Sun May 11 20:06:26 2014
@@ -71,12 +71,12 @@ public class StandardSerializer
* @throws ClassNotFoundException
*/
@Override
- public <T> T deSerialize( byte[] data )
+ public <T> T deSerialize( byte[] data, ClassLoader loader )
throws IOException, ClassNotFoundException
{
ByteArrayInputStream bais = new ByteArrayInputStream( data );
BufferedInputStream bis = new BufferedInputStream( bais );
- ObjectInputStream ois = new ObjectInputStreamClassLoaderAware( bis,
null );
+ ObjectInputStream ois = new ObjectInputStreamClassLoaderAware( bis,
loader );
try
{
@SuppressWarnings("unchecked") // Need to cast from Object
Modified:
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCacheUnitTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCacheUnitTest.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCacheUnitTest.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCacheUnitTest.java
Sun May 11 20:06:26 2014
@@ -141,7 +141,7 @@ public class BlockDiskCacheUnitTest
resultData = newTotal;
}
- Serializable result = elementSerializer.deSerialize( resultData );
+ Serializable result = elementSerializer.deSerialize( resultData, null
);
// System.out.println( result );
assertEquals( "wrong string after retrieval", string, result );
}
Modified:
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/engine/control/MockElementSerializer.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/engine/control/MockElementSerializer.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/engine/control/MockElementSerializer.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/engine/control/MockElementSerializer.java
Sun May 11 20:06:26 2014
@@ -48,11 +48,11 @@ public class MockElementSerializer
*
*/
@Override
- public <T> T deSerialize( byte[] bytes )
+ public <T> T deSerialize( byte[] bytes, ClassLoader loader )
throws IOException, ClassNotFoundException
{
deSerializeCount++;
- return serializer.deSerialize( bytes );
+ return serializer.deSerialize( bytes, loader );
}
/**
Modified:
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/serialization/CompressingSerializerUnitTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/serialization/CompressingSerializerUnitTest.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/serialization/CompressingSerializerUnitTest.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/serialization/CompressingSerializerUnitTest.java
Sun May 11 20:06:26 2014
@@ -42,7 +42,7 @@ public class CompressingSerializerUnitTe
CompressingSerializer serializer = new CompressingSerializer();
// DO WORK
- Object result = serializer.deSerialize( null );
+ Object result = serializer.deSerialize( null, null );
// VERIFY
assertNull( "Should have nothing.", result );
@@ -63,7 +63,7 @@ public class CompressingSerializerUnitTe
// DO WORK
String before =
"adsfdsafdsafdsafdsafdsafdsafdsagfdsafdsafdsfdsafdsafsa333 31231";
- String after = (String) serializer.deSerialize( serializer.serialize(
before ) );
+ String after = (String) serializer.deSerialize( serializer.serialize(
before ), null );
// VERIFY
assertEquals( "Before and after should be the same.", before, after );
@@ -84,7 +84,7 @@ public class CompressingSerializerUnitTe
// DO WORK
byte[] serialized = serializer.serialize( before );
- String after = (String) serializer.deSerialize( serialized );
+ String after = (String) serializer.deSerialize( serialized, null );
// VERIFY
assertNull( "Should have nothing. after =" + after, after );
Modified:
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/serialization/StandardSerializerUnitTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/serialization/StandardSerializerUnitTest.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/serialization/StandardSerializerUnitTest.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/serialization/StandardSerializerUnitTest.java
Sun May 11 20:06:26 2014
@@ -43,7 +43,7 @@ public class StandardSerializerUnitTest
String before =
"adsfdsafdsafdsafdsafdsafdsafdsagfdsafdsafdsfdsafdsafsa333 31231";
// DO WORK
- String after = (String) serializer.deSerialize( serializer.serialize(
before ) );
+ String after = (String) serializer.deSerialize( serializer.serialize(
before ), null );
// VERIFY
assertEquals( "Before and after should be the same.", before, after );
@@ -66,7 +66,7 @@ public class StandardSerializerUnitTest
byte[] serialized = serializer.serialize( before );
//System.out.println( "testNullInput " + serialized );
- String after = (String) serializer.deSerialize( serialized );
+ String after = (String) serializer.deSerialize( serialized, null );
//System.out.println( "testNullInput " + after );
// VERIFY
@@ -94,7 +94,7 @@ public class StandardSerializerUnitTest
String before = sb.toString();
// DO WORK
- String after = (String) serializer.deSerialize( serializer.serialize(
before ) );
+ String after = (String) serializer.deSerialize( serializer.serialize(
before ), null );
// VERIFY
assertEquals( "Before and after should be the same.", before, after );
Modified:
commons/proper/jcs/trunk/commons-jcs-jcache/src/main/java/org/apache/commons/jcs/jcache/JCSCache.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-jcache/src/main/java/org/apache/commons/jcs/jcache/JCSCache.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-jcache/src/main/java/org/apache/commons/jcs/jcache/JCSCache.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-jcache/src/main/java/org/apache/commons/jcs/jcache/JCSCache.java
Sun May 11 20:06:26 2014
@@ -19,6 +19,7 @@
package org.apache.commons.jcs.jcache;
import org.apache.commons.jcs.access.CacheAccess;
+import org.apache.commons.jcs.engine.behavior.IElementSerializer;
import org.apache.commons.jcs.engine.control.CompositeCache;
import org.apache.commons.jcs.jcache.jmx.JCSCacheMXBean;
import org.apache.commons.jcs.jcache.jmx.JCSCacheStatisticsMXBean;
@@ -26,6 +27,7 @@ import org.apache.commons.jcs.jcache.jmx
import org.apache.commons.jcs.jcache.lang.Subsitutor;
import org.apache.commons.jcs.jcache.proxy.ExceptionWrapperHandler;
import org.apache.commons.jcs.jcache.thread.DaemonThreadFactory;
+import org.apache.commons.jcs.utils.serialization.StandardSerializer;
import javax.cache.Cache;
import javax.cache.CacheManager;
@@ -47,7 +49,6 @@ import javax.cache.processor.EntryProces
import javax.cache.processor.EntryProcessorResult;
import javax.management.ObjectName;
import java.io.Closeable;
-import java.io.Serializable;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
@@ -81,6 +82,7 @@ public class JCSCache<K, V> implements C
private final Map<CacheEntryListenerConfiguration<K, V>, JCSListener<K,
V>> listeners = new ConcurrentHashMap<CacheEntryListenerConfiguration<K, V>,
JCSListener<K, V>>();
private final Statistics statistics = new Statistics();
private final ExecutorService pool;
+ private final IElementSerializer serializer; // using json/xml should work
as well -> don't force Serializable
public JCSCache(final ClassLoader classLoader, final JCSCachingManager mgr,
@@ -96,9 +98,18 @@ public class JCSCache<K, V> implements C
config = configuration;
final int poolSize = Integer.parseInt(property(properties, cacheName,
"pool.size", "3"));
- final DaemonThreadFactory threadFactory = new
DaemonThreadFactory("JCS-JCache-");
+ final DaemonThreadFactory threadFactory = new
DaemonThreadFactory("JCS-JCache-" + cacheName + "-");
pool = poolSize > 0 ? Executors.newFixedThreadPool(poolSize,
threadFactory) : Executors.newCachedThreadPool(threadFactory);
+ try
+ {
+ serializer =
IElementSerializer.class.cast(classLoader.loadClass(property(properties,
"serializer", cacheName, StandardSerializer.class.getName())).newInstance());
+ }
+ catch (final Exception e)
+ {
+ throw new IllegalArgumentException(e);
+ }
+
final Factory<CacheLoader<K, V>> cacheLoaderFactory =
configuration.getCacheLoaderFactory();
if (cacheLoaderFactory == null)
{
@@ -217,8 +228,8 @@ public class JCSCache<K, V> implements C
{
if (config.isStoreByValue())
{
- final Serializable copy = copy(manager.getClassLoader(),
Serializable.class.cast(key.getKey()));
- delegate.put(new JCSKey<K>((K) copy), elt);
+ final K copy = copy(serializer, manager.getClassLoader(),
key.getKey());
+ delegate.put(new JCSKey<K>(copy), elt);
}
}
@@ -286,7 +297,7 @@ public class JCSCache<K, V> implements C
final V old = oldElt != null ? oldElt.getElement() : null;
final boolean storeByValue = config.isStoreByValue();
- final V value = storeByValue ? (V) copy(manager.getClassLoader(),
Serializable.class.cast(rawValue)) : rawValue;
+ final V value = storeByValue ? copy(serializer,
manager.getClassLoader(), rawValue) : rawValue;
final boolean created = old == null;
final JCSElement<V> element = new JCSElement<V>(value, created ?
expiryPolicy.getExpiryForCreation()
@@ -301,7 +312,7 @@ public class JCSCache<K, V> implements C
else
{
writer.write(new JCSEntry<K, V>(key, value));
- final JCSKey<K> jcsKey = storeByValue ? new JCSKey<K>((K)
copy(manager.getClassLoader(), Serializable.class.cast(key))) : cacheKey;
+ final JCSKey<K> jcsKey = storeByValue ? new
JCSKey<K>(copy(serializer, manager.getClassLoader(), key)) : cacheKey;
jcsKey.access(start);
delegate.put(jcsKey, element);
for (final JCSListener<K, V> listener : listeners.values())
Modified:
commons/proper/jcs/trunk/commons-jcs-jcache/src/main/java/org/apache/commons/jcs/jcache/serialization/Serializations.java
URL:
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-jcache/src/main/java/org/apache/commons/jcs/jcache/serialization/Serializations.java?rev=1593847&r1=1593846&r2=1593847&view=diff
==============================================================================
---
commons/proper/jcs/trunk/commons-jcs-jcache/src/main/java/org/apache/commons/jcs/jcache/serialization/Serializations.java
(original)
+++
commons/proper/jcs/trunk/commons-jcs-jcache/src/main/java/org/apache/commons/jcs/jcache/serialization/Serializations.java
Sun May 11 20:06:26 2014
@@ -18,95 +18,19 @@
*/
package org.apache.commons.jcs.jcache.serialization;
-import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.ObjectStreamClass;
-import java.io.Serializable;
-import java.lang.reflect.Proxy;
+import org.apache.commons.jcs.engine.behavior.IElementSerializer;
public class Serializations
{
- public static <K extends Serializable> K copy(final ClassLoader loader,
final K key)
+ public static <K> K copy(final IElementSerializer serializer, final
ClassLoader loader, final K key)
{
try
{
- return deSerialize(serialize(key), loader);
+ return serializer.deSerialize(serializer.serialize(key), loader);
}
catch ( final Exception e)
{
throw new IllegalStateException(e);
}
}
-
- private static <T extends Serializable> byte[] serialize( T obj ) throws
IOException
- {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream( baos );
- try
- {
- oos.writeObject( obj );
- }
- finally
- {
- oos.close();
- }
- return baos.toByteArray();
- }
-
- private static <T extends Serializable> T deSerialize( final byte[] data,
final ClassLoader loader ) throws IOException, ClassNotFoundException
- {
- ByteArrayInputStream bais = new ByteArrayInputStream( data );
- BufferedInputStream bis = new BufferedInputStream( bais );
- ObjectInputStream ois = new ObjectInputStreamClassLoaderAware( bis,
loader );
- try
- {
- return (T) ois.readObject();
- }
- finally
- {
- ois.close();
- }
- }
-
- private static class ObjectInputStreamClassLoaderAware extends
ObjectInputStream
- {
- private final ClassLoader classLoader;
-
- public ObjectInputStreamClassLoaderAware(final InputStream in, final
ClassLoader classLoader) throws IOException
- {
- super(in);
- this.classLoader = classLoader != null ? classLoader :
Thread.currentThread().getContextClassLoader();
- }
-
- @Override
- protected Class<?> resolveClass(final ObjectStreamClass desc) throws
ClassNotFoundException
- {
- return Class.forName(desc.getName(), false, classLoader);
- }
-
- @Override
- protected Class resolveProxyClass(final String[] interfaces) throws
IOException, ClassNotFoundException
- {
- final Class[] cinterfaces = new Class[interfaces.length];
- for (int i = 0; i < interfaces.length; i++)
- {
- cinterfaces[i] = Class.forName(interfaces[i], false,
classLoader);
- }
-
- try
- {
- return Proxy.getProxyClass(classLoader, cinterfaces);
- }
- catch (IllegalArgumentException e)
- {
- throw new ClassNotFoundException(null, e);
- }
- }
-
- }
}