Exemplo n.º 1
0
        /// <summary>
        /// Generates schema for given .NET Type
        /// </summary>
        public static string GenerateSchema(Type type)
        {
            var schemaBuilder = new ReflectionSchemaBuilder(new AvroSerializerSettings());
            var schema        = schemaBuilder.BuildSchema(type);

            return(schema.ToString());
        }
Exemplo n.º 2
0
        /// <summary>
        /// Generates schema for given .NET Type
        /// <paramref name="includeOnlyDataContractMembers"/> indicates if only classes with DataContractAttribute and properties marked with DataMemberAttribute should be returned
        /// </summary>
        public static string GenerateSchema(Type type, bool includeOnlyDataContractMembers)
        {
            var builder = new ReflectionSchemaBuilder(new AvroSerializerSettings(includeOnlyDataContractMembers));
            var schema  = builder.BuildSchema(type);

            return(schema.ToString());
        }
Exemplo n.º 3
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 StateSerializer <T> Create <T>(SerializerSettings settings)
        {
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }

            var key = Tuple.Create(typeof(T), settings);

            lock (TypedSerializers)
            {
                if (TypedSerializers.TryGetValue(key, out object serializer) && settings.UseCache)
                {
                    return((StateSerializer <T>)serializer);
                }
            }

            var reader          = new ReflectionSchemaBuilder(settings).BuildSchema(typeof(T));
            var serializerTyped = new StateSerializer <T>(reader);

            if (settings.UseCache)
            {
                TypedSerializers.Add(key, serializerTyped);
            }
            return(serializerTyped);
        }
Exemplo n.º 4
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));
        }
        private static void RoundTripTestNullableSchema(
            AvroSerializerSettings settings,
            bool rootSchemaIsUnion,
            bool nullableValueSchemaNullableIsUnion,
            bool nullableValueSchemaNotNullableIsUnion,
            bool valueSchemaNullableIsUnion,
            bool valueSchemaNotNullableIsUnion,
            bool referenceSchemaNullableIsUnion,
            bool referenceSchemaNotNullableIsUnion)
        {
            var          builder      = new ReflectionSchemaBuilder(settings);
            var          schema       = builder.BuildSchema(typeof(ClassWithSchemaNullableField));
            RecordSchema recordSchema = null;

            if (rootSchemaIsUnion)
            {
                var asUnion = schema as UnionSchema;
                Assert.IsNotNull(asUnion);

                var innerNullSchema = asUnion.Schemas[0] is NullSchema
                ? asUnion.Schemas[0]
                : asUnion.Schemas[1];

                recordSchema = asUnion.Schemas.Single(s => s != innerNullSchema) as RecordSchema;
                Assert.IsNotNull(recordSchema);
            }
            else
            {
                recordSchema = schema as RecordSchema;
                Assert.IsNotNull(recordSchema);
            }

            Assert.AreEqual(typeof(ClassWithSchemaNullableField).GetAllFields().Count(), recordSchema.Fields.Count);

            var nullableValueSchemaNullable = recordSchema.Fields.Single(f => f.Name == "NullableValueNullableSchema");

            ValidateSchema(nullableValueSchemaNullable.TypeSchema, nullableValueSchemaNullableIsUnion, typeof(IntSchema));

            var nullableValueSchemaNotNullable = recordSchema.Fields.Single(f => f.Name == "NullableValueNotNullableSchema");

            ValidateSchema(nullableValueSchemaNotNullable.TypeSchema, nullableValueSchemaNotNullableIsUnion, typeof(IntSchema));

            var valueSchemaNullable = recordSchema.Fields.Single(f => f.Name == "NotNullableValueNullableSchema");

            ValidateSchema(valueSchemaNullable.TypeSchema, valueSchemaNullableIsUnion, typeof(IntSchema));

            var valueSchemaNotNullable = recordSchema.Fields.Single(f => f.Name == "NotNullableValueNotNullableSchema");

            ValidateSchema(valueSchemaNotNullable.TypeSchema, valueSchemaNotNullableIsUnion, typeof(IntSchema));

            var referenceSchemaNullable = recordSchema.Fields.Single(f => f.Name == "ReferenceFieldNullableSchema");

            ValidateSchema(referenceSchemaNullable.TypeSchema, referenceSchemaNullableIsUnion, typeof(RecordSchema));

            var referenceSchemaNotNullable = recordSchema.Fields.Single(f => f.Name == "ReferenceFieldNotNullableSchema");

            ValidateSchema(referenceSchemaNotNullable.TypeSchema, referenceSchemaNotNullableIsUnion, typeof(RecordSchema));
        }
        public void BuildDateTimeSchema(Type type)
        {
            //Act
            var        builder = new ReflectionSchemaBuilder();
            TypeSchema schema  = builder.BuildSchema(type);


            //Assert
            Assert.IsType <TimestampMillisecondsSchema>(schema);
            var resolvedSchema = (TimestampMillisecondsSchema)schema;

            Assert.NotNull(resolvedSchema);
        }
        public void BuildGuidSchema(Type type)
        {
            //Act
            var        builder = new ReflectionSchemaBuilder();
            TypeSchema schema  = builder.BuildSchema(type);


            //Assert
            Assert.IsType <UuidSchema>(schema);
            var uuidSchema = (UuidSchema)schema;

            Assert.NotNull(uuidSchema);
        }
        public void BuildTimespanSchema(Type type)
        {
            //Act
            var        builder = new ReflectionSchemaBuilder();
            TypeSchema schema  = builder.BuildSchema(type);


            //Assert
            Assert.IsType <DurationSchema>(schema);
            var resolvedSchema = (DurationSchema)schema;

            Assert.NotNull(resolvedSchema);
        }
        public void BuildDecimalSchema(Type type, int precision, int scale)
        {
            //Act
            var        builder = new ReflectionSchemaBuilder();
            TypeSchema schema  = builder.BuildSchema(type);


            //Assert
            Assert.IsType <DecimalSchema>(schema);
            var decimalSchema = (DecimalSchema)schema;

            Assert.NotNull(schema);
            Assert.Equal(precision, decimalSchema.Precision);
            Assert.Equal(scale, decimalSchema.Scale);
        }
Exemplo n.º 10
0
        public void BuildTimeSpanSchema(Type type)
        {
            //Act
            var        builder = new ReflectionSchemaBuilder();
            TypeSchema schema  = builder.BuildSchema(type);


            //Assert
            Assert.IsType <UnionSchema>(schema);
            var unionSchema = (UnionSchema)schema;

            Assert.IsType <NullSchema>(unionSchema.Schemas[0]);
            Assert.IsType <DurationSchema>(unionSchema.Schemas[1]);

            var resolvedSchema = (DurationSchema)unionSchema.Schemas[1];

            Assert.NotNull(resolvedSchema);
        }
Exemplo n.º 11
0
        public void BuildNullableDateTimeSchema(Type type)
        {
            //Act
            var        builder = new ReflectionSchemaBuilder();
            TypeSchema schema  = builder.BuildSchema(type);


            //Assert
            Assert.IsType <UnionSchema>(schema);
            var unionSchema = (UnionSchema)schema;

            Assert.IsType <NullSchema>(unionSchema.Schemas[0]);
            Assert.IsType <TimestampMillisecondsSchema>(unionSchema.Schemas[1]);

            var resolvedSchema = (TimestampMillisecondsSchema)unionSchema.Schemas[1];

            Assert.NotNull(resolvedSchema);
        }
Exemplo n.º 12
0
        public void BuildNullableGuidSchema(Type type)
        {
            //Act
            var        builder = new ReflectionSchemaBuilder();
            TypeSchema schema  = builder.BuildSchema(type);


            //Assert
            Assert.IsType <UnionSchema>(schema);
            var unionSchema = (UnionSchema)schema;

            Assert.IsType <NullSchema>(unionSchema.Schemas[0]);
            Assert.IsType <UuidSchema>(unionSchema.Schemas[1]);

            var uuidSchema = (UuidSchema)unionSchema.Schemas[1];

            Assert.NotNull(uuidSchema);
        }
Exemplo n.º 13
0
        public void BuildSchema_RecordWithAttributes_AttributesAreAppliedToSchema()
        {
            //Arrange
            var builder = new ReflectionSchemaBuilder();


            //Act
            TypeSchema schema = builder.BuildSchema(typeof(AttributeClass));


            //Assert
            Assert.IsType <RecordSchema>(schema);
            var resultSchema = (RecordSchema)schema;

            Assert.NotNull(resultSchema);
            Assert.Equal("This is Doc of User Class", resultSchema.Doc);
            Assert.Equal("User", resultSchema.Name);
            Assert.Equal("userspace", resultSchema.Namespace);

            var stringField = resultSchema.Fields.SingleOrDefault(f => f.Name == "name");

            Assert.NotNull(stringField);
            Assert.Equal("This is Doc of record field", stringField.Doc);

            var intField = resultSchema.Fields.SingleOrDefault(f => f.Name == "favorite_number");

            Assert.NotNull(intField);
            Assert.True(intField.HasDefaultValue);
            Assert.Equal(2137, intField.DefaultValue);


            var decimalField = resultSchema.Fields.SingleOrDefault(f => f.Name == nameof(AttributeClass.AvroDecimal));

            Assert.IsType <DecimalSchema>(decimalField.TypeSchema);
            var decimalSchema = (DecimalSchema)decimalField.TypeSchema;

            Assert.Equal(2, decimalSchema.Scale);
            Assert.Equal(4, decimalSchema.Precision);
        }
Exemplo n.º 14
0
        /// <summary>
        /// Generates schema for given .NET Type
        /// </summary>
        public static string GenerateSchema(Type type)
        {
            var reader = new ReflectionSchemaBuilder(new AvroSerializerSettings(false)).BuildSchema(type);

            return(reader.ToString());
        }
 public ReflectionSchemaTests()
 {
     this.builder = new ReflectionSchemaBuilder(this.settings);
 }
 public void Dispose()
 {
     this.builder = null;
 }
 public void TestTeardown()
 {
     this.builder = null;
 }
 public void TestSetup()
 {
     this.builder = new ReflectionSchemaBuilder(this.settings);
 }
        public static string GenerateSchema(Type type, bool usePropertyNameAsAlias = false, bool includeOnlyDataContractMembers = false)
        {
            var reader = new ReflectionSchemaBuilder(new AvroSerializerSettings(usePropertyNameAsAlias, includeOnlyDataContractMembers)).BuildSchema(type);

            return(reader.ToString());
        }