예제 #1
0
		public static IFormatterBuilder GetBuilder( FormatterRequest request )
		{
			IFormatterBuilder builder = _builders.FirstOrDefault( b => b.CanCreate( request ) );
			if ( builder == null )
				throw new SerializationTypeBinaryAnalysisException( request.Type );

			return builder;
		}
예제 #2
0
        public static Task <IFormatter> GetFormatterAsync(Type type, bool isPolymorph)
        {
            FormatterRequest key = new FormatterRequest(type, isPolymorph);

            if (_formatters.TryGetValue(key, out Task <IFormatter> task))
            {
                return(task);
            }

            TaskCompletionSource <IFormatter> completionSource = null;

            bool lockTaken = false;

            try
            {
                _lock.Enter(ref lockTaken);

                if (_formatters.TryGetValue(key, out task))
                {
                    return(task);
                }

                completionSource = new TaskCompletionSource <IFormatter>();
                _formatters.Add(key, completionSource.Task);
            }
            finally
            {
                if (lockTaken)
                {
                    _lock.Exit();
                }
            }

            IFormatter formatter = CreateFormatter(key);

            completionSource.SetResult(formatter);

            return(completionSource.Task);
        }
예제 #3
0
        private static IFormatter CreateFormatter(FormatterRequest request)
        {
            IFormatterBuilder builder = BuilderResolver.GetBuilder(request);

            return(builder.Create(request.Type));
        }