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")); } }
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")); } }