private static AvroSerializer <T> CreateForCore <T>(string writerSchema, AvroSerializerSettings settings) { if (settings == null) { throw new ArgumentNullException("settings"); } var key = Tuple.Create(writerSchema, typeof(T), settings); var serializer = TypedSerializers.Get(key); if (serializer != null && settings.UseCache) { return(new AvroSerializer <T>(serializer)); } var reader = new ReflectionSchemaBuilder(settings).BuildSchema(typeof(T)); var generator = new SerializerGenerator(); var builderGenerator = new SerializerAssigningVisitor(settings); if (string.IsNullOrEmpty(writerSchema)) { builderGenerator.Visit(reader); serializer = new GeneratedSerializer { WriterSchema = reader, ReaderSchema = reader, Serialize = settings.GenerateSerializer ? generator.GenerateSerializer <T>(reader) : null, Deserialize = settings.GenerateDeserializer ? generator.GenerateDeserializer <T>(reader) : null }; } else { var writer = new JsonSchemaBuilder().BuildSchema(writerSchema); var matchedSchema = new EvolutionSchemaBuilder().Build(writer, reader); if (matchedSchema == null) { throw new SerializationException(string.Format(CultureInfo.InvariantCulture, "Writer schema does not match reader schema.")); } builderGenerator.Visit(matchedSchema); serializer = new GeneratedSerializer { WriterSchema = writer, ReaderSchema = reader, Deserialize = generator.GenerateDeserializer <T>(matchedSchema) }; } if (settings.UseCache) { TypedSerializers.Add(key, serializer); } return(new AvroSerializer <T>(serializer)); }
/// <summary> /// Creates a serializer that allows serializing types attributed with <see cref="T:System.Runtime.Serialization.DataContractAttribute" />. /// </summary> /// <typeparam name="T">The type of objects to serialize.</typeparam> /// <param name="settings">The serialization settings.</param> /// <returns> A serializer. </returns> /// <exception cref="System.ArgumentNullException">Thrown if <paramref name="settings"/> is null.</exception> /// <remarks> /// This function can cause in-memory runtime code generation if the type <typeparamref name="T"/> has not used seen before. /// Otherwise, a cached version of the serializer is given to the user. /// </remarks> public static IAvroSerializer <T> Create <T>(AvroSerializerSettings settings) { if (settings == null) { throw new ArgumentNullException("settings"); } return(CreateForCore <T>(string.Empty, settings)); }
/// <summary> /// Creates a deserializer for the data that was written with the specified <paramref name="writerSchema">schema</paramref>. /// </summary> /// <typeparam name="T">The type of objects to deserialize.</typeparam> /// <param name="writerSchema">The writer schema.</param> /// <param name="settings">The settings.</param> /// <returns> /// A serializer. /// </returns> /// <exception cref="System.ArgumentNullException">Thrown when <paramref name="settings" /> is null.</exception> /// <remarks> /// This function can cause in-memory runtime code generation if the type <typeparamref name="T"/> has not been used before. /// Otherwise, a cached version of the serializer is given to the user. /// </remarks> public static IAvroSerializer <T> CreateDeserializerOnly <T>(string writerSchema, AvroSerializerSettings settings) { if (string.IsNullOrEmpty(writerSchema)) { throw new ArgumentNullException("writerSchema"); } if (settings == null) { throw new ArgumentNullException("settings"); } return(CreateForCore <T>(writerSchema, settings)); }