private static void TestSerializeCore( int id, object returnValue, bool isVoid, RpcException error )
		{
			if ( isVoid )
			{
				Assert.IsNull( returnValue, "Return value should not be specified in void." );
			}

			if ( error != null )
			{
				Assert.IsNull( returnValue, "Return value shoud not be specified in error." );
				Assert.IsFalse( isVoid, "isVoid should be false in error test." );
			}

			// TODO: Mock filters
			var objectTracingFilter = new SerializingResponseTracingFilterProvider();
			var binaryTracingFilter = new SerializedResponseTracingFilterProvider();
			var target =
				SerializerFactory.CreateResponseMessageSerializerWithTracer(
					objectTracingFilter,
					binaryTracingFilter,
					null,
					null
				);
			try
			{
				var buffer = new RpcOutputBuffer( ChunkBuffer.CreateDefault() );

				Assert.IsTrue( target.Serialize( id, returnValue, isVoid, error, buffer ).IsSuccess );
				byte[] serialized = buffer.ReadBytes().ToArray();
				var mpo =
					new MessagePackObject(
						new MessagePackObject[]
					{
						new MessagePackObject( ( int )MessageType.Response ),
						new MessagePackObject( ( uint )id ),
						error == null ? MessagePackObject.Nil : error.RpcError.Identifier,
						returnValue == null 
							? ( error == null ? MessagePackObject.Nil : error.GetExceptionMessage( false ) )
							: MessagePackObject.FromObject( returnValue )						
					}
					);
				var stream = new MemoryStream();
				Packer.Create( stream ).Pack( mpo );
				CollectionAssert.AreEqual(
					stream.ToArray(),
					serialized,
					"Expected:{0}{1}{0}Actual:{0}{2}",
					Environment.NewLine,
					mpo,
					new Unpacker( serialized ).UnpackObject()
				);
			}
			finally
			{
				Console.WriteLine( "OBJECT TRACE:{0}", objectTracingFilter.GetTrace() );
				Console.WriteLine( "BINARY TRACE:{0}", binaryTracingFilter.GetTrace() );
			}
		}
        /// <summary>
        ///		Create <see cref="ResponseMessageSerializer"/> with specified tracer(s).
        /// </summary>
        /// <param name="serializingResponseTracer">Tracer for serializing response.</param>
        /// <param name="serializedResponseTracer">Tracer for serialized response binary stream.</param>
        /// <param name="deserializingResponseTracer">Tracer for deserializing response binary stream.</param>
        /// <param name="deserializedResponseTracer">Tracer for deserialized response.</param>
        /// <returns><see cref="ResponseMessageSerializer"/> with specified tracer(s).</returns>
        public static ResponseMessageSerializer CreateResponseMessageSerializerWithTracer(
			SerializingResponseTracingFilterProvider serializingResponseTracer,
			SerializedResponseTracingFilterProvider serializedResponseTracer,
			DeserializingResponseTracingFilterProvider deserializingResponseTracer,
			DeserializedResponseTracingFilterProvider deserializedResponseTracer
			)
        {
            return
                new ResponseMessageSerializer(
                    serializingResponseTracer == null ? new IFilterProvider<ResponseMessageSerializationFilter>[] { serializingResponseTracer } : null,
                    serializedResponseTracer == null ? new IFilterProvider<SerializedMessageFilter<MessageSerializationContext>>[] { serializedResponseTracer } : null,
                    deserializingResponseTracer == null ? new IFilterProvider<SerializedMessageFilter<MessageDeserializationContext>>[] { deserializingResponseTracer } : null,
                    deserializedResponseTracer == null ? new IFilterProvider<ResponseMessageDeserializationFilter>[] { deserializedResponseTracer } : null,
                    null
                );
        }