public void Component_HeadlessList_ResultIsTheSameAsInput()
        {
            //Arrange
            List <int> list = _fixture.Create <List <int> >();

            var schema = AvroConvert.GenerateSchema(typeof(List <int>));

            //Act
            var serialized = AvroConvert.SerializeHeadless(list, schema);

            var result = new List <int>();

            using (var reader = AvroConvert.OpenDeserializer <int>(new MemoryStream(serialized)))
            {
                while (reader.HasNext())
                {
                    var item = reader.ReadNext();

                    result.Add(item);
                }
            }


            //Assert
            Assert.NotNull(result);
            Assert.NotNull(serialized);
            Assert.Equal(list, result);
        }
Пример #2
0
        public void Component_AvroAttributeClass_ResultIsEqualToInput()
        {
            //Arrange
            AttributeClass toSerialize = new AttributeClass
            {
                AndAnotherString    = "anotherString",
                NullableIntProperty = 1,
                NullableIntPropertyWithDefaultValue = null,
                NullableStringProperty = "nullableString"
            };
            string schema = AvroConvert.GenerateSchema(typeof(AttributeClass));


            //Act
            var result = AvroConvert.SerializeHeadless(toSerialize, schema);

            var deserialized = AvroConvert.DeserializeHeadless <AttributeClass>(result, schema);


            //Assert
            Assert.NotNull(result);
            Assert.NotNull(deserialized);
            Assert.Equal(toSerialize.NullableIntProperty, deserialized.NullableIntProperty);
            Assert.Equal(toSerialize.AndAnotherString, deserialized.AndAnotherString);
            Assert.Equal(toSerialize.NullableStringProperty, deserialized.NullableStringProperty);
            Assert.Equal(2137, deserialized.NullableIntPropertyWithDefaultValue);
        }
        public async Task <byte[]> SerializeAsync(T data, SerializationContext context)
        {
            string subject = $"{context.Topic }-{context.Component}";
            int    id      = 0;
            var    schema  = AvroConvert.GenerateSchema(typeof(T));

            if (cache.ContainsKey(subject))
            {
                id = cache[subject];
            }
            else
            {
                var existingSchema = await RegistryClient.GetLatestSchemaAsync(subject);

                if (existingSchema.SchemaString == schema)
                {
                    cache.AddOrUpdate(subject, existingSchema.Id, (key, oldValue) => existingSchema.Id);
                }
                else
                {
                    Confluent.SchemaRegistry.Schema confluentSchema = new Confluent.SchemaRegistry.Schema(
                        subject,
                        existingSchema.Version + 1,
                        0,
                        schema
                        );

                    id = await RegistryClient.RegisterSchemaAsync(subject, confluentSchema.ToString());

                    cache.AddOrUpdate(subject, id, (key, oldValue) => id);
                }
            }

            using (var stream = new MemoryStream())
            {
                //Confluent Kafka format:
                //https://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html#wire-format

                //Magic number
                stream.WriteByte(0x00);

                //Id
                var idAsBytes = BitConverter.GetBytes(id);
                stream.Write(idAsBytes, 0, idAsBytes.Length);

                //Data
                var serializedData = AvroConvert.SerializeHeadless(data, schema);
                stream.Write(serializedData, 0, serializedData.Length);

                return(stream.ToArray());
            }
        }
Пример #4
0
        public void Component_SerializeHeadlessBiggerObjectAndReadSmaller_NoError()
        {
            //Arrange
            VeryComplexClass toSerialize = _fixture.Create <VeryComplexClass>();
            string           schema      = AvroConvert.GenerateSchema(typeof(VeryComplexClass));

            //Act
            var result = AvroConvert.SerializeHeadless(toSerialize, schema);

            var deserialized = AvroConvert.DeserializeHeadless <VeryComplexClass>(result, schema);

            //Assert
            Assert.NotNull(result);
            Assert.NotNull(deserialized);
            Assert.Equal(toSerialize, deserialized);
        }
Пример #5
0
        public void Component_DeserializeWithMissingFields_NoError()
        {
            //Arrange
            BaseTestClass toSerialize = _fixture.Create <BaseTestClass>();
            string        schema      = AvroConvert.GenerateSchema(typeof(BaseTestClass));

            //Act
            var result = AvroConvert.SerializeHeadless(toSerialize, schema);

            var deserialized = AvroConvert.DeserializeHeadless <ReducedBaseTestClass>(result, schema);

            //Assert
            Assert.NotNull(result);
            Assert.NotNull(deserialized);
            Assert.Equal(toSerialize.justSomeProperty, deserialized.justSomeProperty);
        }
Пример #6
0
        public void Component_SerializeHeadlessBiggerObjectAndReadSmaller_NoError()
        {
            //Arrange
            ExtendedBaseTestClass toSerialize = _fixture.Create <ExtendedBaseTestClass>();
            string schema = AvroConvert.GenerateSchema(typeof(BaseTestClass));

            //Act
            var result = AvroConvert.SerializeHeadless(toSerialize, schema);

            var deserialized = AvroConvert.DeserializeHeadless <BaseTestClass>(result, schema);

            //Assert
            Assert.NotNull(result);
            Assert.NotNull(deserialized);
            Assert.Equal(toSerialize.andLongProperty, deserialized.andLongProperty);
            Assert.Equal(toSerialize.justSomeProperty, deserialized.justSomeProperty);
        }
        public void Avro2Json_ConvertDouble_ProducedDesiredJson()
        {
            //Arrange
            var doubleTestObject = 21.34;

            var expectedJson = JsonConvert.SerializeObject(doubleTestObject);

            var schema         = AvroConvert.GenerateSchema(doubleTestObject.GetType());
            var avroSerialized = AvroConvert.SerializeHeadless(doubleTestObject, schema);


            //Act
            var resultJson = AvroConvert.Avro2Json(avroSerialized, schema);


            //Assert
            Assert.Equal(expectedJson, resultJson);
        }
        public void Avro2Json_ConvertNull_ProducedDesiredJson()
        {
            //Arrange
            string nullTestObject = null;

            var expectedJson = JsonConvert.SerializeObject(nullTestObject);

            var schema         = AvroConvert.GenerateSchema(nullTestObject?.GetType());
            var avroSerialized = AvroConvert.SerializeHeadless(nullTestObject, schema);


            //Act
            var resultJson = AvroConvert.Avro2Json(avroSerialized, schema);


            //Assert
            Assert.Equal(expectedJson, resultJson);
        }
        public void Avro2Json_ConvertInt_ProducedDesiredJson()
        {
            //Arrange
            var @int = 2137;

            var expectedJson = JsonConvert.SerializeObject(@int);

            var schema         = AvroConvert.GenerateSchema(@int.GetType());
            var avroSerialized = AvroConvert.SerializeHeadless(@int, schema);


            //Act
            var resultJson = AvroConvert.Avro2Json(avroSerialized, schema);


            //Assert
            Assert.Equal(expectedJson, resultJson);
        }
        public void Avro2Json_ConvertString_ProducedDesiredJson()
        {
            //Arrange
            var @string = "I am the serialization string";

            var expectedJson = JsonConvert.SerializeObject(@string);

            var schema         = AvroConvert.GenerateSchema(@string.GetType());
            var avroSerialized = AvroConvert.SerializeHeadless(@string, schema);


            //Act
            var resultJson = AvroConvert.Avro2Json(avroSerialized, schema);


            //Assert
            Assert.Equal(expectedJson, resultJson);
        }
        public void Avro2Json_ConvertArray_ProducedDesiredJson()
        {
            //Arrange
            var arrayTestObject = new int[] { 2, 1, 3, 7, 453, 1, 6, };

            var expectedJson = JsonConvert.SerializeObject(arrayTestObject);

            var schema         = AvroConvert.GenerateSchema(arrayTestObject.GetType());
            var avroSerialized = AvroConvert.SerializeHeadless(arrayTestObject, schema);


            //Act
            var resultJson = AvroConvert.Avro2Json(avroSerialized, schema);


            //Assert
            Assert.Equal(expectedJson, resultJson);
        }
        public byte[] Serialize(T data, SerializationContext context)
        {
            using (var stream = new MemoryStream())
            {
                //Magic number
                stream.WriteByte(0x00);

                //Id is unknown and not needed - put 0000
                stream.WriteByte(0x00);
                stream.WriteByte(0x00);
                stream.WriteByte(0x00);
                stream.WriteByte(0x00);

                var serializedData = AvroConvert.SerializeHeadless(data, _schema);
                stream.Write(serializedData, 0, serializedData.Length);

                return(stream.ToArray());
            }
        }
        public void Avro2Json_ConvertComplexType_ProducedDesiredJson()
        {
            //Arrange
            var user = new User();

            user.favorite_color  = "blue";
            user.favorite_number = 2137;
            user.name            = "red";

            var expectedJson = JsonConvert.SerializeObject(user);

            var schema         = AvroConvert.GenerateSchema(user.GetType());
            var avroSerialized = AvroConvert.SerializeHeadless(user, schema);


            //Act
            var resultJson = AvroConvert.Avro2Json(avroSerialized, schema);


            //Assert
            Assert.Equal(expectedJson, resultJson);
        }
Пример #14
0
        public static void Invoke()
        {
            //Arrange
            var     fixture = new Fixture();
            Dataset dataset = fixture.Create <Dataset>();

            var    schema       = AvroConvert.GenerateSchema(typeof(Dataset));
            Schema apacheSchema = Schema.Parse(schema);


            //AvroConvert to Apache
            var avroConvertSerialized = AvroConvert.SerializeHeadless(dataset, schema);

            Dataset apacheDeserialized;

            using (var ms = new MemoryStream(avroConvertSerialized))
            {
                var apacheReader = new GenericDatumReader <GenericRecord>(apacheSchema, apacheSchema);
                var decoder      = new BinaryDecoder(ms);
                apacheDeserialized = (ApacheAvroHelpers.Decreate <Dataset>(apacheReader.Read(null, decoder)));
            }

            Contract.Assert(dataset == apacheDeserialized);


            //Apache to AvroConvert
            MemoryStream apacheAvroSerializeStream = new MemoryStream();
            var          encoder      = new BinaryEncoder(apacheAvroSerializeStream);
            var          apacheWriter = new GenericDatumWriter <GenericRecord>(apacheSchema);

            apacheWriter.Write(ApacheAvroHelpers.Create(dataset, apacheSchema), encoder);

            var apacheSerialized = apacheAvroSerializeStream.ToArray();

            var avroConvertDeserialized = AvroConvert.DeserializeHeadless <Dataset>(apacheSerialized);

            Contract.Assert(dataset == avroConvertDeserialized);
        }
Пример #15
0
        private static BenchmarkResult RunBenchmark(Dataset[] datasets, string schema)
        {
            var result = new BenchmarkResult();

            Stopwatch stopwatch = Stopwatch.StartNew();


            //Serialize Apache.Avro
            MemoryStream apacheAvroSerializeStream = new MemoryStream();
            var          encoder      = new BinaryEncoder(apacheAvroSerializeStream);
            var          apacheSchema = Schema.Parse(AvroConvert.GenerateSchema(typeof(Dataset)));

            var apacheWriter = new GenericDatumWriter <GenericRecord>(apacheSchema);

            foreach (var dataset in datasets)
            {
                apacheWriter.Write(ApacheAvroHelpers.Create(dataset, apacheSchema), encoder);
            }

            var apacheAvro = apacheAvroSerializeStream.ToArray();

            result.ApacheAvroSerializeTime = stopwatch.ElapsedMilliseconds;
            stopwatch.Restart();

            //Deserialize Apache.Avro

            List <Dataset> apacheResult = new List <Dataset>();

            using (var ms = new MemoryStream(apacheAvro))
            {
                apacheSchema = Schema.Parse(AvroConvert.GenerateSchema(typeof(Dataset)));
                var apacheReader = new GenericDatumReader <GenericRecord>(apacheSchema, apacheSchema);
                var decoder      = new BinaryDecoder(ms);
                foreach (var dataset in datasets)
                {
                    apacheResult.Add(ApacheAvroHelpers.Decreate <Dataset>(apacheReader.Read(null, decoder)));
                }
            }
            result.ApacheAvroDeserializeTime = stopwatch.ElapsedMilliseconds;
            stopwatch.Restart();


            //Serialize AvroConvert Headerless
            var avroHeadless = AvroConvert.SerializeHeadless(datasets, schema);

            result.AvroConvertHeadlessSerializeTime = stopwatch.ElapsedMilliseconds;
            stopwatch.Restart();

            //Deserialize AvroConvert Headerless
            AvroConvert.DeserializeHeadless <List <Dataset> >(avroHeadless, schema);
            result.AvroConvertHeadlessDeserializeTime = stopwatch.ElapsedMilliseconds;
            stopwatch.Restart();


            //Serialize AvroConvert Gzip
            var avroGzip = AvroConvert.Serialize(datasets, CodecType.GZip);

            result.AvroConvertGzipSerializeTime = stopwatch.ElapsedMilliseconds;
            stopwatch.Restart();

            //Deserialize AvroConvert Gzip
            AvroConvert.Deserialize <Dataset[]>(avroGzip);
            result.AvroConvertGzipDeserializeTime = stopwatch.ElapsedMilliseconds;
            stopwatch.Restart();


            //Serialize AvroConvert vNext
            var newAvro = AvroConvertToUpdate.AvroConvert.SerializeHeadless(datasets, schema);

            result.AvroConvertVNextHeadlessSerializeTime = stopwatch.ElapsedMilliseconds;
            stopwatch.Restart();

            //Deserialize AvroConvert vNext
            AvroConvertToUpdate.AvroConvert.DeserializeHeadless <Dataset[]>(newAvro, schema);
            result.AvroConvertVNextHeadlessDeserializeTime = stopwatch.ElapsedMilliseconds;
            stopwatch.Stop();

            //Serialize AvroConvert vNext Gzip
            var newAvroGzip = AvroConvertToUpdate.AvroConvert.Serialize(datasets, AvroConvertToUpdate.Codec.CodecType.GZip);

            result.AvroConvertVNextGzipSerializeTime = stopwatch.ElapsedMilliseconds;
            stopwatch.Restart();

            //Deserialize AvroConvert vNext Gzip
            AvroConvertToUpdate.AvroConvert.Deserialize <Dataset[]>(newAvroGzip);
            result.AvroConvertVNextGzipDeserializeTime = stopwatch.ElapsedMilliseconds;
            stopwatch.Stop();


            //Size
            result.ApacheAvroSize           = apacheAvro.Length;
            result.AvroConvertHeadlessSize  = avroHeadless.Length;
            result.AvroConvertGzipSize      = avroGzip.Length;
            result.AvroConvertVNextSize     = newAvro.Length;
            result.AvroConvertVNextGzipSize = newAvroGzip.Length;

            return(result);
        }
        static async Task Main(string[] args)
        {
            double temperature;
            var    rand = new Random();

            using (var security = new SecurityProviderSymmetricKey(registrationId, primaryKey, secondaryKey))
                using (var transport = new ProvisioningTransportHandlerMqtt())
                {
                    ProvisioningDeviceClient provClient = ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, idScope, security, transport);
                    DeviceRegistrationResult result     = await provClient.RegisterAsync();

                    IAuthenticationMethod auth = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, (security as SecurityProviderSymmetricKey).GetPrimaryKey());

                    using (DeviceClient iotClient = DeviceClient.Create(result.AssignedHub, auth, TransportType.Mqtt))
                    {
                        while (true)
                        {
                            if (_temperature.IsAvailable)
                            {
                                temperature = Math.Round(_temperature.Temperature.DegreesCelsius, 2);
                            }
                            else
                            {
                                temperature = rand.Next(15, 35);
                            }

                            try
                            {
                                msgId++;

                                Console.WriteLine($"The CPU temperature is {temperature}");

                                Image img = Image.FromFile(filename); // simulate camera captured image

                                using (MemoryStream ms = new MemoryStream())
                                {
                                    img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

                                    TelemetryAvro telemetryAvro = new TelemetryAvro()
                                    {
                                        Temperature = temperature,
                                        Humidity    = 50,
                                        Pressure    = 1100,
                                        MsgId       = msgId,
                                        Label       = "Orange",
                                        Probability = 1.0,
                                        Image       = ms.ToArray(),
                                        DeviceId    = string.Empty // this is set in the azure function when writing to cosmosdb
                                    };

                                    var serialized = AvroConvert.SerializeHeadless(telemetryAvro, avroTelemetrySchema);

                                    // Deserialise AVRO
                                    // var deserialized = AvroConvert.DeserializeHeadless<TelemetryAvro>(serialized, avroTelemetrySchema);
                                    // using (MemoryStream mStream = new MemoryStream(deserialized.Image))
                                    // {
                                    //     Image.FromStream(mStream).Save(appDirectory + "images/orangev2.jpg");
                                    // }

                                    await SendMsgIotHub(iotClient, serialized);

                                    await SendMsgIotHub(iotClient, temperature);
                                }
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine("exception msg: " + ex.Message);
                            }
                            Thread.Sleep(4000);
                        }
                    }
                }
        }