Пример #1
0
        /// <summary>
        /// Creates a JSON serializer specialized for objects of the specified type <typeparamref name="T"/>.
        /// </summary>
        /// <typeparam name="T">The type of the objects to serialize.</typeparam>
        /// <param name="provider">Name provider used to determine JSON object keys for properties and fields.</param>
        /// <param name="settings">The settings to configure the resulting serializer.</param>
        /// <returns>A fast JSON serializer specified for objects of the specified type <typeparamref name="T"/>.</returns>
        public static IFastJsonSerializer <T> CreateSerializer <T>(INameProvider provider, FastJsonSerializerSettings settings)
        {
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }

            if (provider == null)
            {
                provider = DefaultNameProvider.Instance;
            }

            //
            // CONSIDER: Caching of serializers per type in a ConditionalWeakTable. However, we have to ensure different configurations
            //           don't get mixed up (e.g. based on providers).
            //
            // CONSIDER: Adding support for registration of custom serializers for given types. These would follow the EmitAction delegate
            //           and append an object of the given type to the StringBuilder.
            //

            var builderString = new EmitterStringBuilder(provider);
            var emitterString = builderString.Build <T>();

#if !NO_IO
            var builderWriter = new EmitterWriterBuilder(provider);
            var emitterWriter = builderWriter.Build <T>();

            if (settings.ConcurrencyMode == FastJsonConcurrencyMode.SingleThreaded)
            {
                return(new Serializer <T>(emitterString, builderString, emitterWriter, builderWriter));
            }
            else
            {
                return(new SafeSerializer <T>(emitterString, builderString, emitterWriter, builderWriter));
            }
#else
            if (settings.ConcurrencyMode == FastJsonConcurrencyMode.SingleThreaded)
            {
                return(new Serializer <T>(emitterString, builderString));
            }
            else
            {
                return(new SafeSerializer <T>(emitterString, builderString));
            }
#endif
        }
 /// <summary>
 /// Creates a new serializer given the specified emitter implementation.
 /// </summary>
 /// <param name="emitter">The emitter to use to serialize objects.</param>
 /// <param name="builder">The builder to use to create emitters for objects based on their runtime type.</param>
 public SafeSerializer(EmitStringAction <T> emitter, EmitterStringBuilder builder)
     : base(emitter)
 {
     _contextPool = new ObjectPool <EmitterContext>(() => new EmitterContext(builder));
 }
Пример #3
0
 /// <summary>
 /// Creates a new serializer given the specified emitter implementation.
 /// </summary>
 /// <param name="emitterString">The emitter to use to serialize objects to string outputs.</param>
 /// <param name="builderString">The builder to use to create emitters for objects based on their runtime type.</param>
 /// <param name="emitterWriter">The emitter to use to serialize objects to text writers.</param>
 /// <param name="builderWriter">The builder to use to create emitters for objects based on their runtime type.</param>
 public Serializer(EmitStringAction <T> emitterString, EmitterStringBuilder builderString, EmitWriterAction <T> emitterWriter, EmitterWriterBuilder builderWriter)
     : base(emitterString, emitterWriter)
 {
     _context = new EmitterContext(builderString, builderWriter);
 }