/// <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)); }
/// <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); }