Changed unittests according to the new Source / Target interfaces and introduced a reworked version of SerializerInputStream / SerializerOutputStream

git-svn-id: https://svn.apache.org/repos/asf/directmemory/lightning/trunk@1405128 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lightning-core/src/main/java/org/apache/directmemory/lightning/Source.java b/lightning-core/src/main/java/org/apache/directmemory/lightning/Source.java
index ec1f1e2..c0c00b4 100644
--- a/lightning-core/src/main/java/org/apache/directmemory/lightning/Source.java
+++ b/lightning-core/src/main/java/org/apache/directmemory/lightning/Source.java
@@ -28,9 +28,6 @@
 
     long readableBytes();
 
-    boolean readBoolean()
-        throws IOException;
-
     int readBytes( byte[] bytes )
         throws IOException;
 
diff --git a/lightning-core/src/main/java/org/apache/directmemory/lightning/Target.java b/lightning-core/src/main/java/org/apache/directmemory/lightning/Target.java
index 4d5dc50..526b5b4 100644
--- a/lightning-core/src/main/java/org/apache/directmemory/lightning/Target.java
+++ b/lightning-core/src/main/java/org/apache/directmemory/lightning/Target.java
@@ -28,9 +28,6 @@
 
     long writtenBytes();
 
-    void writeBoolean( boolean value )
-        throws IOException;
-
     void writeBytes( byte[] bytes )
         throws IOException;
 
diff --git a/lightning-core/src/main/java/org/apache/directmemory/lightning/io/ByteBufferSource.java b/lightning-core/src/main/java/org/apache/directmemory/lightning/io/ByteBufferSource.java
index 2490ad1..875ee03 100644
--- a/lightning-core/src/main/java/org/apache/directmemory/lightning/io/ByteBufferSource.java
+++ b/lightning-core/src/main/java/org/apache/directmemory/lightning/io/ByteBufferSource.java
@@ -31,13 +31,6 @@
     }
 
     @Override
-    public boolean readBoolean()
-        throws IOException
-    {
-        return readByte() == 1 ? true : false;
-    }
-
-    @Override
     public int readBytes( byte[] bytes )
         throws IOException
     {
diff --git a/lightning-core/src/main/java/org/apache/directmemory/lightning/io/ByteBufferTarget.java b/lightning-core/src/main/java/org/apache/directmemory/lightning/io/ByteBufferTarget.java
index ca214a1..ce910a1 100644
--- a/lightning-core/src/main/java/org/apache/directmemory/lightning/io/ByteBufferTarget.java
+++ b/lightning-core/src/main/java/org/apache/directmemory/lightning/io/ByteBufferTarget.java
@@ -30,13 +30,6 @@
     }
 
     @Override
-    public void writeBoolean( boolean value )
-        throws IOException
-    {
-        writeByte( (byte) ( value ? 1 : 0 ) );
-    }
-
-    @Override
     public void writeBytes( byte[] bytes )
         throws IOException
     {
diff --git a/lightning-core/src/main/java/org/apache/directmemory/lightning/io/InputStreamSource.java b/lightning-core/src/main/java/org/apache/directmemory/lightning/io/InputStreamSource.java
index 131b1bc..7b243a3 100644
--- a/lightning-core/src/main/java/org/apache/directmemory/lightning/io/InputStreamSource.java
+++ b/lightning-core/src/main/java/org/apache/directmemory/lightning/io/InputStreamSource.java
@@ -65,13 +65,6 @@
     }
 
     @Override
-    public boolean readBoolean()
-        throws IOException
-    {
-        return readByte() == 1 ? true : false;
-    }
-
-    @Override
     public int readBytes( byte[] bytes )
         throws IOException
     {
diff --git a/lightning-core/src/main/java/org/apache/directmemory/lightning/io/OutputStreamTarget.java b/lightning-core/src/main/java/org/apache/directmemory/lightning/io/OutputStreamTarget.java
index d936a2c..132f58c 100644
--- a/lightning-core/src/main/java/org/apache/directmemory/lightning/io/OutputStreamTarget.java
+++ b/lightning-core/src/main/java/org/apache/directmemory/lightning/io/OutputStreamTarget.java
@@ -41,13 +41,6 @@
     }
 
     @Override
-    public void writeBoolean( boolean value )
-        throws IOException
-    {
-        writeByte( (byte) ( value ? 1 : 0 ) );
-    }
-
-    @Override
     public void writeBytes( byte[] bytes )
         throws IOException
     {
diff --git a/lightning-core/src/main/java/org/apache/directmemory/lightning/io/SerializerInputStream.java b/lightning-core/src/main/java/org/apache/directmemory/lightning/io/SerializerInputStream.java
new file mode 100644
index 0000000..4354c44
--- /dev/null
+++ b/lightning-core/src/main/java/org/apache/directmemory/lightning/io/SerializerInputStream.java
@@ -0,0 +1,178 @@
+package org.apache.directmemory.lightning.io;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+
+import org.apache.directmemory.lightning.Serializer;
+import org.apache.directmemory.lightning.Source;
+
+public class SerializerInputStream
+    implements ObjectInput
+{
+
+    private final Serializer serializer;
+
+    private final Source source;
+
+    public SerializerInputStream( Serializer serializer, Source source )
+    {
+        this.serializer = serializer;
+        this.source = source;
+    }
+
+    @Override
+    public void readFully( byte[] b )
+        throws IOException
+    {
+        readFully( b, 0, b.length );
+    }
+
+    @Override
+    public void readFully( byte[] b, int off, int len )
+        throws IOException
+    {
+        source.readBytes( b, off, len );
+    }
+
+    @Override
+    public int skipBytes( int n )
+        throws IOException
+    {
+        throw new UnsupportedOperationException( "skipBytes is not implemented in the underlying Source type" );
+    }
+
+    @Override
+    public boolean readBoolean()
+        throws IOException
+    {
+        return source.readBoolean();
+    }
+
+    @Override
+    public byte readByte()
+        throws IOException
+    {
+        return source.readByte();
+    }
+
+    @Override
+    public int readUnsignedByte()
+        throws IOException
+    {
+        return source.readUnsignedByte();
+    }
+
+    @Override
+    public short readShort()
+        throws IOException
+    {
+        return source.readShort();
+    }
+
+    @Override
+    public int readUnsignedShort()
+        throws IOException
+    {
+        return (char) ( ( ( source.readByte() & 0x000000FF ) << 8 ) | ( source.readByte() & 0x000000FF ) );
+    }
+
+    @Override
+    public char readChar()
+        throws IOException
+    {
+        return source.readChar();
+    }
+
+    @Override
+    public int readInt()
+        throws IOException
+    {
+        return source.readInt();
+    }
+
+    @Override
+    public long readLong()
+        throws IOException
+    {
+        return source.readLong();
+    }
+
+    @Override
+    public float readFloat()
+        throws IOException
+    {
+        return source.readFloat();
+    }
+
+    @Override
+    public double readDouble()
+        throws IOException
+    {
+        return source.readDouble();
+    }
+
+    @Override
+    public String readLine()
+        throws IOException
+    {
+        return readUTF();
+    }
+
+    @Override
+    public String readUTF()
+        throws IOException
+    {
+        return source.readString();
+    }
+
+    @Override
+    public Object readObject()
+        throws ClassNotFoundException, IOException
+    {
+        return serializer.deserialize( source );
+    }
+
+    @Override
+    public int read()
+        throws IOException
+    {
+        return 0;
+    }
+
+    @Override
+    public int read( byte[] b )
+        throws IOException
+    {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    @Override
+    public int read( byte[] b, int off, int len )
+        throws IOException
+    {
+        return source.readByte();
+    }
+
+    @Override
+    public long skip( long n )
+        throws IOException
+    {
+        throw new UnsupportedOperationException( "skip is not implemented in the underlying Source type" );
+    }
+
+    @Override
+    public int available()
+        throws IOException
+    {
+        return (int) source.readableBytes();
+    }
+
+    @Override
+    public void close()
+        throws IOException
+    {
+        // nothing to implement here
+    }
+
+}
diff --git a/lightning-core/src/main/java/org/apache/directmemory/lightning/io/SerializerOutputStream.java b/lightning-core/src/main/java/org/apache/directmemory/lightning/io/SerializerOutputStream.java
new file mode 100644
index 0000000..eac2473
--- /dev/null
+++ b/lightning-core/src/main/java/org/apache/directmemory/lightning/io/SerializerOutputStream.java
@@ -0,0 +1,146 @@
+package org.apache.directmemory.lightning.io;
+
+import java.io.IOException;
+import java.io.ObjectOutput;
+
+import org.apache.directmemory.lightning.Serializer;
+import org.apache.directmemory.lightning.Target;
+
+public class SerializerOutputStream
+    implements ObjectOutput
+{
+
+    private final Serializer serializer;
+
+    private final Target target;
+
+    public SerializerOutputStream( Serializer serializer, Target target )
+    {
+        this.serializer = serializer;
+        this.target = target;
+    }
+
+    @Override
+    public void write( int b )
+        throws IOException
+    {
+        target.writeByte( (byte) b );
+    }
+
+    @Override
+    public void writeBoolean( boolean v )
+        throws IOException
+    {
+        target.writeBoolean( v );
+    }
+
+    @Override
+    public void writeByte( int v )
+        throws IOException
+    {
+        target.writeByte( (byte) v );
+    }
+
+    @Override
+    public void writeShort( int v )
+        throws IOException
+    {
+        target.writeShort( (short) v );
+    }
+
+    @Override
+    public void writeChar( int v )
+        throws IOException
+    {
+        target.writeChar( (char) v );
+    }
+
+    @Override
+    public void writeInt( int v )
+        throws IOException
+    {
+        target.writeInt( v );
+    }
+
+    @Override
+    public void writeLong( long v )
+        throws IOException
+    {
+        target.writeLong( v );
+    }
+
+    @Override
+    public void writeFloat( float v )
+        throws IOException
+    {
+        target.writeFloat( v );
+    }
+
+    @Override
+    public void writeDouble( double v )
+        throws IOException
+    {
+        target.writeDouble( v );
+    }
+
+    @Override
+    public void writeBytes( String s )
+        throws IOException
+    {
+        target.writeString( s );
+    }
+
+    @Override
+    public void writeChars( String s )
+        throws IOException
+    {
+        char[] chars = s.toCharArray();
+        for ( int i = 0; i < chars.length; i++ )
+        {
+            target.writeChar( chars[i] );
+        }
+    }
+
+    @Override
+    public void writeUTF( String s )
+        throws IOException
+    {
+        target.writeString( s );
+    }
+
+    @Override
+    public void writeObject( Object obj )
+        throws IOException
+    {
+        serializer.serialize( obj, target );
+    }
+
+    @Override
+    public void write( byte[] b )
+        throws IOException
+    {
+        write( b, 0, b.length );
+    }
+
+    @Override
+    public void write( byte[] b, int off, int len )
+        throws IOException
+    {
+        target.writeBytes( b, off, len );
+    }
+
+    @Override
+    public void flush()
+        throws IOException
+    {
+        // nothing to implement here
+    }
+
+    @Override
+    public void close()
+        throws IOException
+    {
+        // nothing to implement here
+    }
+
+}
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/Benchmark.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/Benchmark.java
index cc8a0cf..413b1fd 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/Benchmark.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/Benchmark.java
@@ -23,8 +23,6 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.DataInput;
-import java.io.DataOutput;
 import java.io.File;
 import java.io.IOException;
 import java.io.ObjectInputStream;
@@ -33,11 +31,10 @@
 import java.util.Random;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.directmemory.lightning.Lightning;
-import org.apache.directmemory.lightning.SerializationContext;
-import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractObjectMarshaller;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.io.SerializerInputStream;
 import org.apache.directmemory.lightning.io.SerializerOutputStream;
 import org.apache.directmemory.lightning.metadata.Attribute;
@@ -67,7 +64,8 @@
         for ( int i = 0; i < WARMUP_ROUNDS; i++ )
         {
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+            OutputStreamTarget target = new OutputStreamTarget( baos );
+            SerializerOutputStream out = new SerializerOutputStream( serializer, target );
             Foo foo = buildRandomFoo();
             out.writeObject( foo );
 
@@ -92,7 +90,8 @@
 
             long startTime = System.nanoTime();
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+            OutputStreamTarget target = new OutputStreamTarget( baos );
+            SerializerOutputStream out = new SerializerOutputStream( serializer, target );
             out.writeObject( foo );
 
             time += System.nanoTime() - startTime;
@@ -126,7 +125,8 @@
         for ( int i = 0; i < WARMUP_ROUNDS; i++ )
         {
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+            OutputStreamTarget target = new OutputStreamTarget( baos );
+            SerializerOutputStream out = new SerializerOutputStream( serializer, target );
             Foo foo = buildRandomFoo();
             out.writeObject( foo );
 
@@ -136,7 +136,8 @@
             size = baos.toByteArray().length;
 
             ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-            SerializerInputStream in = new SerializerInputStream( bais, serializer );
+            InputStreamSource source = new InputStreamSource( bais );
+            SerializerInputStream in = new SerializerInputStream( serializer, source );
             Object value = in.readObject();
             assertNotNull( value );
             assertEquals( foo, value );
@@ -156,12 +157,14 @@
             Foo foo = buildRandomFoo();
 
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+            OutputStreamTarget target = new OutputStreamTarget( baos );
+            SerializerOutputStream out = new SerializerOutputStream( serializer, target );
             out.writeObject( foo );
 
             long startTime = System.nanoTime();
             ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-            SerializerInputStream in = new SerializerInputStream( bais, serializer );
+            InputStreamSource source = new InputStreamSource( bais );
+            SerializerInputStream in = new SerializerInputStream( serializer, source );
             Object value = in.readObject();
             time += System.nanoTime() - startTime;
             assertNotNull( value );
@@ -480,14 +483,14 @@
         }
 
         @Override
-        public void marshall( Object value, PropertyDescriptor propertyDescriptor, DataOutput dataOutput,
+        public void marshall( Object value, PropertyDescriptor propertyDescriptor, Target target,
                               SerializationContext serializationContext )
             throws IOException
         {
         }
 
         @Override
-        public <V> V unmarshall( V value, PropertyDescriptor propertyDescriptor, DataInput dataInput,
+        public <V> V unmarshall( V value, PropertyDescriptor propertyDescriptor, Source source,
                                  SerializationContext serializationContext )
             throws IOException
         {
@@ -507,14 +510,14 @@
         }
 
         @Override
-        public void marshall( Object value, PropertyDescriptor propertyDescriptor, DataOutput dataOutput,
+        public void marshall( Object value, PropertyDescriptor propertyDescriptor, Target target,
                               SerializationContext serializationContext )
             throws IOException
         {
         }
 
         @Override
-        public <V> V unmarshall( V value, PropertyDescriptor propertyDescriptor, DataInput dataInput,
+        public <V> V unmarshall( V value, PropertyDescriptor propertyDescriptor, Source source,
                                  SerializationContext serializationContext )
             throws IOException
         {
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/ComplexClassHierarchyTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/ComplexClassHierarchyTestCase.java
index 9943c40..ba962f5 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/ComplexClassHierarchyTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/ComplexClassHierarchyTestCase.java
@@ -25,10 +25,10 @@
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 
-import org.apache.directmemory.lightning.Lightning;
-import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.io.SerializerInputStream;
 import org.apache.directmemory.lightning.io.SerializerOutputStream;
 import org.apache.directmemory.lightning.metadata.Attribute;
@@ -57,7 +57,8 @@
         foo.setName( "SomeName" );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
         out.writeObject( foo );
 
         assertNotNull( baos );
@@ -65,7 +66,8 @@
         assertNotNull( baos.toByteArray() );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
         Object value = in.readObject();
         assertNotNull( value );
         assertEquals( foo, value );
@@ -94,7 +96,8 @@
         complex.setBar( Bar.SomeOtherValue );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
         out.writeObject( complex );
 
         assertNotNull( baos );
@@ -102,7 +105,8 @@
         assertNotNull( baos.toByteArray() );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
         Object value = in.readObject();
         assertNotNull( value );
         assertEquals( complex, value );
@@ -131,7 +135,8 @@
         complex.setBar( Bar.SomeOtherValue );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
         out.writeObject( complex );
 
         assertNotNull( baos );
@@ -139,7 +144,8 @@
         assertNotNull( baos.toByteArray() );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
         Object value = in.readObject();
         assertNotNull( value );
         assertEquals( complex, value );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/GenericTypedTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/GenericTypedTestCase.java
index 03c4244..1f6dd2b 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/GenericTypedTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/GenericTypedTestCase.java
@@ -27,9 +27,9 @@
 import java.io.PrintStream;
 import java.util.List;
 
-import org.apache.directmemory.lightning.Lightning;
-import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.io.SerializerInputStream;
 import org.apache.directmemory.lightning.io.SerializerOutputStream;
 import org.apache.directmemory.lightning.logging.LogLevel;
@@ -60,7 +60,8 @@
         // foo.setName("SomeName");
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
         out.writeObject( foo );
 
         assertNotNull( baos );
@@ -68,7 +69,8 @@
         assertNotNull( baos.toByteArray() );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
         Object value = in.readObject();
         assertNotNull( value );
         assertEquals( foo, value );
@@ -97,7 +99,8 @@
         complex.setBar( Bar.SomeOtherValue );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
         out.writeObject( complex );
 
         assertNotNull( baos );
@@ -105,7 +108,8 @@
         assertNotNull( baos.toByteArray() );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
         Object value = in.readObject();
         assertNotNull( value );
         assertEquals( complex, value );
@@ -134,7 +138,8 @@
         complex.setBar( Bar.SomeOtherValue );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
         out.writeObject( complex );
 
         assertNotNull( baos );
@@ -142,7 +147,8 @@
         assertNotNull( baos.toByteArray() );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
         Object value = in.readObject();
         assertNotNull( value );
         assertEquals( complex, value );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/PropertyFinderTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/PropertyFinderTestCase.java
index 9bf3188..db255ab 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/PropertyFinderTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/PropertyFinderTestCase.java
@@ -25,10 +25,10 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 
-import org.apache.directmemory.lightning.Lightning;
-import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.ClassDescriptorAwareSerializer;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.io.SerializerInputStream;
 import org.apache.directmemory.lightning.io.SerializerOutputStream;
 import org.apache.directmemory.lightning.metadata.Attribute;
@@ -60,7 +60,8 @@
         assertEquals( 2, classDescriptor.getPropertyDescriptors().size() );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         Standard standard = new Standard();
         standard.setValue1( "Foo" );
@@ -68,7 +69,8 @@
         out.writeObject( standard );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         Standard result = (Standard) in.readObject();
 
@@ -96,7 +98,8 @@
         assertEquals( 2, classDescriptor.getPropertyDescriptors().size() );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         Standard standard = new Standard();
         standard.setValue1( "Foo" );
@@ -104,7 +107,8 @@
         out.writeObject( standard );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         Standard result = (Standard) in.readObject();
 
@@ -132,7 +136,8 @@
         assertEquals( 2, classDescriptor.getPropertyDescriptors().size() );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         Standard standard = new Standard();
         standard.setValue1( "Foo" );
@@ -140,7 +145,8 @@
         out.writeObject( standard );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         Standard result = (Standard) in.readObject();
 
@@ -168,7 +174,8 @@
         assertEquals( 1, classDescriptor.getPropertyDescriptors().size() );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         Standard standard = new Standard();
         standard.setValue1( "Foo" );
@@ -176,7 +183,8 @@
         out.writeObject( standard );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         Standard result = (Standard) in.readObject();
 
@@ -205,7 +213,8 @@
         assertEquals( 2, classDescriptor.getPropertyDescriptors().size() );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         Inherted inherted = new Inherted();
         inherted.setValue1( "Foo" );
@@ -215,7 +224,8 @@
         out.writeObject( inherted );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         Inherted result = (Inherted) in.readObject();
 
@@ -246,7 +256,8 @@
         assertEquals( 4, classDescriptor.getPropertyDescriptors().size() );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         Inherted inherted = new Inherted();
         inherted.setValue1( "Foo" );
@@ -256,7 +267,8 @@
         out.writeObject( inherted );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         Standard result = (Standard) in.readObject();
 
@@ -284,13 +296,15 @@
         assertEquals( 3, classDescriptor.getPropertyDescriptors().size() );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         Composed composed = new Composed( "Foo", 123, "Bar" );
         out.writeObject( composed );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         Composed result = (Composed) in.readObject();
 
@@ -318,7 +332,8 @@
         assertEquals( 3, classDescriptor.getPropertyDescriptors().size() );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         ComposedInherted composedInherted = new ComposedInherted();
         composedInherted.setValue1( "Foo" );
@@ -327,7 +342,8 @@
         out.writeObject( composedInherted );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         ComposedInherted result = (ComposedInherted) in.readObject();
 
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/WhatShouldItLookLike.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/WhatShouldItLookLike.java
index 0707020..5280ac5 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/WhatShouldItLookLike.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/WhatShouldItLookLike.java
@@ -20,8 +20,6 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.DataInput;
-import java.io.DataOutput;
 import java.io.IOException;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -29,16 +27,13 @@
 import java.util.Arrays;
 import java.util.List;
 
-import org.apache.directmemory.lightning.Lightning;
-import org.apache.directmemory.lightning.MarshallerContext;
-import org.apache.directmemory.lightning.MarshallerStrategy;
-import org.apache.directmemory.lightning.SerializationContext;
-import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractObjectMarshaller;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.configuration.TypeIntrospector;
 import org.apache.directmemory.lightning.generator.PropertyDescriptorFactory;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.io.SerializerInputStream;
 import org.apache.directmemory.lightning.io.SerializerOutputStream;
 import org.apache.directmemory.lightning.metadata.ClassDefinitionContainer;
@@ -48,6 +43,7 @@
 {
 
     public static void main( String[] args )
+        throws IOException, ClassNotFoundException
     {
         Serializer serializer2 =
             Lightning.newBuilder().logger( new DebugLogger() ).serializerDefinitions( new ExampleSerializerDefinition() ).build();
@@ -72,7 +68,8 @@
         foo.someOther = 123;
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
         out.writeObject( foo );
         System.out.println( foo );
 
@@ -80,7 +77,8 @@
         System.out.println( Arrays.toString( data ) );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( data );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
         Object value = in.readObject();
         System.out.println( value );
     }
@@ -254,14 +252,14 @@
         }
 
         @Override
-        public void marshall( Object value, PropertyDescriptor propertyDescriptor, DataOutput dataOutput,
+        public void marshall( Object value, PropertyDescriptor propertyDescriptor, Target target,
                               SerializationContext serializationContext )
             throws IOException
         {
         }
 
         @Override
-        public <V> V unmarshall( V value, PropertyDescriptor propertyDescriptor, DataInput dataInput,
+        public <V> V unmarshall( V value, PropertyDescriptor propertyDescriptor, Source source,
                                  SerializationContext serializationContext )
             throws IOException
         {
@@ -281,14 +279,14 @@
         }
 
         @Override
-        public void marshall( Object value, PropertyDescriptor propertyDescriptor, DataOutput dataOutput,
+        public void marshall( Object value, PropertyDescriptor propertyDescriptor, Target target,
                               SerializationContext serializationContext )
             throws IOException
         {
         }
 
         @Override
-        public <V> V unmarshall( V value, PropertyDescriptor propertyDescriptor, DataInput dataInput,
+        public <V> V unmarshall( V value, PropertyDescriptor propertyDescriptor, Source source,
                                  SerializationContext serializationContext )
             throws IOException
         {
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ArrayMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ArrayMarshallerTestCase.java
index 92136b3..536bbde 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ArrayMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ArrayMarshallerTestCase.java
@@ -30,6 +30,8 @@
 import org.apache.directmemory.lightning.Lightning;
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.io.SerializerInputStream;
 import org.apache.directmemory.lightning.io.SerializerOutputStream;
 import org.apache.directmemory.lightning.metadata.Attribute;
@@ -68,12 +70,14 @@
         }, test.array );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         out.writeObject( test );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         BooleanArray result = (BooleanArray) in.readObject();
 
@@ -107,12 +111,14 @@
         }, test.array );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         out.writeObject( test );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         ByteArray result = (ByteArray) in.readObject();
 
@@ -146,12 +152,14 @@
         }, test.array );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         out.writeObject( test );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         CharArray result = (CharArray) in.readObject();
 
@@ -185,12 +193,14 @@
         }, test.array );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         out.writeObject( test );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         ShortArray result = (ShortArray) in.readObject();
 
@@ -224,12 +234,14 @@
         }, test.array );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         out.writeObject( test );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         IntArray result = (IntArray) in.readObject();
 
@@ -263,12 +275,14 @@
         }, test.array );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         out.writeObject( test );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         LongArray result = (LongArray) in.readObject();
 
@@ -302,12 +316,14 @@
         }, test.array );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         out.writeObject( test );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         FloatArray result = (FloatArray) in.readObject();
 
@@ -341,12 +357,14 @@
         }, test.array );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         out.writeObject( test );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         DoubleArray result = (DoubleArray) in.readObject();
 
@@ -380,12 +398,14 @@
         }, test.array );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         out.writeObject( test );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         ObjectArray result = (ObjectArray) in.readObject();
 
@@ -430,12 +450,14 @@
         }, test.array );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SerializerOutputStream out = new SerializerOutputStream( baos, serializer );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        SerializerOutputStream out = new SerializerOutputStream( serializer, target );
 
         out.writeObject( test );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        SerializerInputStream in = new SerializerInputStream( bais, serializer );
+        InputStreamSource source = new InputStreamSource( bais );
+        SerializerInputStream in = new SerializerInputStream( serializer, source );
 
         DeepObjectArray result = (DeepObjectArray) in.readObject();
 
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/BigDecimalMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/BigDecimalMarshallerTestCase.java
index 1ddef48..0a0ec41 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/BigDecimalMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/BigDecimalMarshallerTestCase.java
@@ -31,6 +31,8 @@
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.metadata.Attribute;
 import org.junit.Test;
 
@@ -61,10 +63,12 @@
         value.setValue3( BigDecimal.valueOf( random.nextLong() ).subtract( BigDecimal.valueOf( random.nextLong() ) ) );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -75,10 +79,12 @@
         value.setValue3( null );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -89,10 +95,12 @@
         value.setValue3( BigDecimal.valueOf( random.nextLong() ).add( BigDecimal.valueOf( random.nextLong() ) ) );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/BigIntegerMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/BigIntegerMarshallerTestCase.java
index 540666a..9abb50d 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/BigIntegerMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/BigIntegerMarshallerTestCase.java
@@ -31,6 +31,8 @@
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.metadata.Attribute;
 import org.junit.Test;
 
@@ -61,10 +63,12 @@
         value.setValue3( BigInteger.valueOf( random.nextLong() ).subtract( BigInteger.valueOf( random.nextLong() ) ) );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -75,10 +79,12 @@
         value.setValue3( null );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -89,10 +95,12 @@
         value.setValue3( BigInteger.valueOf( random.nextLong() ).add( BigInteger.valueOf( random.nextLong() ) ) );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/BooleanMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/BooleanMarshallerTestCase.java
index c7d15ac..736d852 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/BooleanMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/BooleanMarshallerTestCase.java
@@ -29,6 +29,8 @@
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.metadata.Attribute;
 import org.junit.Test;
 
@@ -56,10 +58,12 @@
         value.setValue2( false );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -69,10 +73,12 @@
         value.setValue2( true );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -100,10 +106,12 @@
         value.setValue3( false );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -114,10 +122,12 @@
         value.setValue3( null );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -128,10 +138,12 @@
         value.setValue3( false );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ByteMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ByteMarshallerTestCase.java
index a564941..f0289aa 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ByteMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ByteMarshallerTestCase.java
@@ -29,6 +29,8 @@
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.metadata.Attribute;
 import org.junit.Test;
 
@@ -56,10 +58,12 @@
         value.setValue2( Byte.MAX_VALUE );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -69,10 +73,12 @@
         value.setValue2( (byte) 20 );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -100,10 +106,12 @@
         value.setValue3( (byte) 34 );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -114,10 +122,12 @@
         value.setValue3( null );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -128,10 +138,12 @@
         value.setValue3( Byte.MAX_VALUE );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/CharacterMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/CharacterMarshallerTestCase.java
index 309d56e..167a74a 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/CharacterMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/CharacterMarshallerTestCase.java
@@ -29,6 +29,8 @@
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.metadata.Attribute;
 import org.junit.Test;
 
@@ -56,10 +58,12 @@
         value.setValue2( Character.MAX_VALUE );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -69,10 +73,12 @@
         value.setValue2( (char) 20 );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -100,10 +106,12 @@
         value.setValue3( (char) 34 );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -114,10 +122,12 @@
         value.setValue3( null );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -128,10 +138,12 @@
         value.setValue3( Character.MAX_VALUE );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/DoubleMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/DoubleMarshallerTestCase.java
index d20b09c..d83b316 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/DoubleMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/DoubleMarshallerTestCase.java
@@ -29,6 +29,8 @@
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.metadata.Attribute;
 import org.junit.Test;
 
@@ -56,10 +58,12 @@
         value.setValue2( Double.MAX_VALUE );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -69,10 +73,12 @@
         value.setValue2( 20 );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -100,10 +106,12 @@
         value.setValue3( 34D );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -114,10 +122,12 @@
         value.setValue3( null );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -128,10 +138,12 @@
         value.setValue3( Double.MAX_VALUE );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/FloatMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/FloatMarshallerTestCase.java
index 9ea3ea2..b0c0c4f 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/FloatMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/FloatMarshallerTestCase.java
@@ -29,6 +29,8 @@
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.metadata.Attribute;
 import org.junit.Test;
 
@@ -56,10 +58,12 @@
         value.setValue2( Float.MAX_VALUE );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -69,10 +73,12 @@
         value.setValue2( 20 );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -100,10 +106,12 @@
         value.setValue3( 34F );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -114,10 +122,12 @@
         value.setValue3( null );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -128,10 +138,12 @@
         value.setValue3( Float.MAX_VALUE );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/IntegerMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/IntegerMarshallerTestCase.java
index cbeb815..5123de8 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/IntegerMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/IntegerMarshallerTestCase.java
@@ -29,6 +29,8 @@
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.metadata.Attribute;
 import org.junit.Test;
 
@@ -56,10 +58,12 @@
         value.setValue2( Integer.MAX_VALUE );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -69,10 +73,12 @@
         value.setValue2( (short) 20 );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -100,10 +106,12 @@
         value.setValue3( 34 );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -114,10 +122,12 @@
         value.setValue3( null );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -128,10 +138,12 @@
         value.setValue3( Integer.MAX_VALUE );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ListMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ListMarshallerTestCase.java
index f9f8672..e95f8ab 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ListMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ListMarshallerTestCase.java
@@ -32,6 +32,8 @@
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.metadata.Attribute;
 import org.junit.Test;
 
@@ -65,10 +67,12 @@
         value.setList( list );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -100,10 +104,12 @@
         value.setList( list );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -146,10 +152,12 @@
         value.setList( list );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/LongMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/LongMarshallerTestCase.java
index be33b3c..63553fc 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/LongMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/LongMarshallerTestCase.java
@@ -29,6 +29,8 @@
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.metadata.Attribute;
 import org.junit.Test;
 
@@ -56,10 +58,12 @@
         value.setValue2( Long.MAX_VALUE );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -69,10 +73,12 @@
         value.setValue2( 20 );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -100,10 +106,12 @@
         value.setValue3( 34L );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -114,10 +122,12 @@
         value.setValue3( null );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -128,10 +138,12 @@
         value.setValue3( Long.MAX_VALUE );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/MapMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/MapMarshallerTestCase.java
index da3b546..7377fa4 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/MapMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/MapMarshallerTestCase.java
@@ -34,8 +34,9 @@
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.metadata.Attribute;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class MapMarshallerTestCase
@@ -68,10 +69,12 @@
         value.setMap( map );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -102,10 +105,12 @@
         value.setMap( map );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -148,10 +153,12 @@
         value.setSet( set );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/SetMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/SetMarshallerTestCase.java
index aa24909..a2c52f8 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/SetMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/SetMarshallerTestCase.java
@@ -32,8 +32,9 @@
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.metadata.Attribute;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class SetMarshallerTestCase
@@ -66,10 +67,12 @@
         value.setSet( set );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -101,10 +104,12 @@
         value.setSet( set );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -147,10 +152,12 @@
         value.setSet( set );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
diff --git a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ShortMarshallerTestCase.java b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ShortMarshallerTestCase.java
index e15fd9a..824fe88 100644
--- a/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ShortMarshallerTestCase.java
+++ b/lightning-core/src/test/java/org/apache/directmemory/lightning/internal/marshaller/ShortMarshallerTestCase.java
@@ -29,6 +29,8 @@
 import org.apache.directmemory.lightning.Serializer;
 import org.apache.directmemory.lightning.base.AbstractSerializerDefinition;
 import org.apache.directmemory.lightning.internal.util.DebugLogger;
+import org.apache.directmemory.lightning.io.InputStreamSource;
+import org.apache.directmemory.lightning.io.OutputStreamTarget;
 import org.apache.directmemory.lightning.metadata.Attribute;
 import org.junit.Test;
 
@@ -56,10 +58,12 @@
         value.setValue2( Short.MAX_VALUE );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -69,10 +73,12 @@
         value.setValue2( (short) 20 );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -100,10 +106,12 @@
         value.setValue3( (short) 34 );
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        OutputStreamTarget target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
-        Object result = serializer.deserialize( bais );
+        InputStreamSource source = new InputStreamSource( bais );
+        Object result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -114,10 +122,12 @@
         value.setValue3( null );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );
@@ -128,10 +138,12 @@
         value.setValue3( Short.MAX_VALUE );
 
         baos = new ByteArrayOutputStream();
-        serializer.serialize( value, baos );
+        target = new OutputStreamTarget( baos );
+        serializer.serialize( value, target );
 
         bais = new ByteArrayInputStream( baos.toByteArray() );
-        result = serializer.deserialize( bais );
+        source = new InputStreamSource( bais );
+        result = serializer.deserialize( source );
 
         assertNotNull( result );
         assertEquals( value, result );