protected object DeserializeReplyInternal(Message message, object[] parameters)
        {
            var retParamInfo = ParameterTypes.FirstOrDefault(x => x.ParamType == ParamType.Return);

            if (retParamInfo == null)
            {
                return(null);
            }

            var store = ObjectBuilder.GetModelStore();

            var serializer = ObjectBuilder.GetSerializer();

            var reader = message.GetReaderAtBodyContents();

            reader.Read();

            var model = store.GetModel(retParamInfo.Type, ModeType.Wcf);

            if (model == null)
            {
                throw new InvalidOperationException("The model cannot be null, meta data fetch failed. Type: " + retParamInfo.Type.FullName);
            }

            reader.Read();

            var val = reader.Value;

            var data = BinaryConverter.FromString(val);

            var compressionType = GetMessageCompressionTypeOptions(message);

            if (compressionType != CompressionTypeOptions.None)
            {
                var compressionProvider = new CompressionProvider();

                data = compressionProvider.DeCompress(data, compressionType);
            }

            object retVal;

            try
            {
                retVal = serializer.Deserialize(data, model.MetaData, retParamInfo.Type, ModeType.Wcf);
            }
            catch (SerializationException)
            {
                store.RemoveModel(retParamInfo.Type, ModeType.Wcf);

                throw;
            }
            return(retVal);
        }
        protected Message SerializeReplyInternal(MessageVersion messageVersion, object[] parameters, object result)
        {
            var retParamInfo = ParameterTypes.FirstOrDefault(x => x.ParamType == ParamType.Return);

            //if (retParamInfo == null)
            //    throw new InvalidOperationException("The return parameter type was not found.");

            var compressionType = DefaultCompressionType;

            Func <string[]> valueGetter = () =>
            {
                if (retParamInfo == null)
                {
                    return(new string[0]);
                }

                var modelProvider = ObjectBuilder.GetModelProvider();

                var model = modelProvider.CreateModelInfo(retParamInfo.Type, ModeType.Wcf);

                var serializer = ObjectBuilder.GetSerializer();

                var data = (serializer.Serialize(result, model.MetaData, ModeType.Wcf) ??
                            new SerializationResult(new byte[0], null)).Data;

                if (compressionType != CompressionTypeOptions.None)
                {
                    var compressionProvider = new CompressionProvider();

                    data = compressionProvider.Compress(data, compressionType);
                }

                var value = BinaryConverter.ToString(data);

                return(new[] { value });
            };

            var message = Message.CreateMessage(messageVersion, ContractInfo.Action + "Response",
                                                new ProtoBodyWriter(ContractInfo.OperationContractName, ContractInfo.ServiceNamespace,
                                                                    valueGetter));

            if (compressionType != CompressionTypeOptions.None)
            {
                AddCompressionHeader(message, DefaultCompressionType);
            }

            return(message);
        }