Esempio n. 1
0
        private static CoffeeMachineData CreateCoffeeMachineData(AvroRecord avroRecord)
        {
            var body              = avroRecord.GetField <byte[]>("Body");
            var dataAsJson        = Encoding.UTF8.GetString(body);
            var coffeeMachineData = JsonConvert.DeserializeObject <CoffeeMachineData>(dataAsJson);

            return(coffeeMachineData);
        }
        public void GenericSerializer_SerializeNestedRecord()
        {
            const string StringSchema = @"{
                                        ""type"":""record"",
                                        ""name"":""Microsoft.Hadoop.Avro.Tests.NestedClass"",
                                        ""fields"":[
                                            {
                                                ""name"":""Nested"",
                                                ""type"":[
                                                    ""null"",
                                                    {
                                                        ""type"":""record"",
                                                        ""name"":""Microsoft.Hadoop.Avro.Tests.SimpleIntClass"",
                                                        ""fields"":[
                                                            {
                                                                 ""name"":""IntField"",
                                                                 ""type"":""int""
                                                            }
                                                        ]
                                                    }
                                                ]
                                            },
                                            {
                                                ""name"":""IntNestedField"",""type"":""int""
                                            }
                                        ]
                                    }";

            var serializer = AvroSerializer.CreateGeneric(StringSchema);
            var nested     = serializer.ReaderSchema as RecordSchema;

            using (var stream = new MemoryStream())
            {
                dynamic expected = new AvroRecord(nested);
                expected.IntNestedField  = 5;
                expected.Nested          = new AvroRecord((nested.GetField("Nested").TypeSchema as UnionSchema).Schemas[1]);
                expected.Nested.IntField = 3;

                serializer.Serialize(stream, expected);
                stream.Position = 0;

                var actual = serializer.Deserialize(stream) as AvroRecord;
                Assert.AreEqual(expected.GetField <AvroRecord>("Nested").GetField <int>("IntField"),
                                actual.GetField <AvroRecord>("Nested").GetField <int>("IntField"));
            }
        }
Esempio n. 3
0
        private void ReadAvroRecord(AvroRecord record, Entity ent, string prefix)
        {
            var fields = record.Schema.Fields.Select(f => f.FullName).ToArray();

            foreach (var field in fields)
            {
                object dataobj = record.GetField <object>(field);
                if (dataobj == null)
                {
                    ent.Properties.Add(GetFieldName(field, prefix), "null");
                }
                else if (dataobj is string str)
                {
                    ent.Properties.Add(GetFieldName(field, prefix), str);
                }
                else if (dataobj is byte[] data)
                {
                    ent.Properties.Add(GetFieldName(field, prefix), Encoding.UTF8.GetString(data));
                }
                else if (dataobj is Dictionary <string, string> dictstr)
                {
                    foreach (var kvp in dictstr)
                    {
                        ent.Properties.Add(GetFieldName(field, prefix) + "." + kvp.Key, kvp.Value);
                    }
                }
                else if (dataobj is Dictionary <string, object> dictobj)
                {
                    foreach (var kvp in dictobj)
                    {
                        if (kvp.Value is AvroRecord avrorecord)
                        {
                            ReadAvroRecord(avrorecord, ent, GetFieldName(field, prefix) + "." + kvp.Key);
                        }
                        else
                        {
                            ent.Properties.Add(GetFieldName(field, prefix) + "." + kvp.Key, kvp.Value?.ToString() ?? "null");
                        }
                    }
                }
                else if (dataobj is AvroRecord avrorecord)
                {
                    ReadAvroRecord(avrorecord, ent, GetFieldName(field, prefix));
                }
                else if (!dataobj.GetType().IsPrimitive)
                {
                    try
                    {
                        var jsonstr = JsonConvert.SerializeObject(dataobj);
                        ent.Properties.Add(GetFieldName(field, prefix), jsonstr ?? "null");
                    }
                    catch (Exception)
                    {
                        ent.Properties.Add(GetFieldName(field, prefix), "Could not create json representation for: " + dataobj?.ToString() ?? "null");
                    }
                }
                else
                {
                    ent.Properties.Add(GetFieldName(field, prefix), dataobj?.ToString() ?? "null");
                }
            }
        }
        public void GenericSerializer_SerializeNestedRecord()
        {
            const string StringSchema = @"{
                                        ""type"":""record"",
                                        ""name"":""Microsoft.Hadoop.Avro.Tests.NestedClass"",
                                        ""fields"":[
                                            {
                                                ""name"":""Nested"",
                                                ""type"":[
                                                    ""null"",
                                                    {
                                                        ""type"":""record"",
                                                        ""name"":""Microsoft.Hadoop.Avro.Tests.SimpleIntClass"",
                                                        ""fields"":[
                                                            {
                                                                 ""name"":""IntField"",
                                                                 ""type"":""int""
                                                            }
                                                        ]
                                                    }
                                                ]
                                            },
                                            {
                                                ""name"":""IntNestedField"",""type"":""int""
                                            }
                                        ]
                                    }";

            var serializer = AvroSerializer.CreateGeneric(StringSchema);
            var nested = serializer.ReaderSchema as RecordSchema;
            using (var stream = new MemoryStream())
            {
                dynamic expected = new AvroRecord(nested);
                expected.IntNestedField = 5;
                expected.Nested = new AvroRecord((nested.GetField("Nested").TypeSchema as UnionSchema).Schemas[1]);
                expected.Nested.IntField = 3;

                serializer.Serialize(stream, expected);
                stream.Position = 0;

                var actual = serializer.Deserialize(stream) as AvroRecord;
                Assert.AreEqual(expected.GetField<AvroRecord>("Nested").GetField<int>("IntField"),
                                actual.GetField<AvroRecord>("Nested").GetField<int>("IntField"));
            }
        }