Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Cannot Reproduce
-
1.7.6
-
None
-
None
-
Windows, C#, .Net 4.5
Description
providing sample code and fix
Sample Schema:
{"namespace": "AvroSample", "type": "record", "name": "User", "fields": [ {"name": "name", "type": "string"}, {"name": "favorite_number", "type": ["int", "null"]}, {"name": "favorite_color", "type": ["string", "null"]} ] }
Sample code to recreate
namespace AvroSample { class Program { static void Main(string[] args) { Schema schema = LoadSchemaFromFile(@"user.avpr"); GenericRecord user1 = new GenericRecord((RecordSchema)schema); user1.Add("name", "Alyssa"); user1.Add("favorite_number", 256); // Leave favorite color null GenericRecord user2 = new GenericRecord((RecordSchema)schema); user2.Add("name", "Ben"); user2.Add("favorite_number", 7); user2.Add("favorite_color", "red"); // Serialize user1 and user2 to disk String outPath = @"C:\\users.avro"; GenericDatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema); IFileWriter<GenericRecord> dataFileWriter = DataFileWriter<GenericRecord>.OpenWriter(datumWriter, outPath); dataFileWriter.Append(user1); dataFileWriter.Append(user2); dataFileWriter.Dispose(); // Deserialize users from disk IFileReader<User> dataFileReader = DataFileReader<User>.OpenReader(outPath);//, schema); User user = null; while (dataFileReader.HasNext()) { // Reuse user object by passing it to next(). This saves us from // allocating and garbage collecting many objects for files with // many items. user = dataFileReader.Next(); Console.WriteLine("Name={0}", user.name); Console.WriteLine(user.ToString()); } Console.WriteLine("Press any key to continue..."); Console.ReadKey(); } static Schema LoadSchema(string json) { Schema schema = Schema.Parse(json); return schema; } static Schema LoadSchemaFromFile(string filePath) { String json = File.ReadAllText(filePath, Encoding.UTF8); return LoadSchema(json); } } }
Code that fixes issue:
protected override void WriteRecordFields(object recordObj, RecordFieldWriter[] writers, Encoder encoder) { var record = (GenericRecord) recordObj; foreach (var writer in writers) { // Change from // writer.WriteField(record[writer.Field.Name], encoder); // to object result = null; record.TryGetValue(writer.Field.Name, out result); writer.WriteField(result, encoder); } } }