Exemple #1
0
        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));
        }
Exemple #2
0
        /// <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));
        }
Exemple #3
0
        /// <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));
        }