[ 
https://issues.apache.org/jira/browse/AVRO-1490?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Martin Tzvetanov Grigorov resolved AVRO-1490.
---------------------------------------------
    Resolution: Cannot Reproduce

Thank you ,[~KSchoonover] !

> GenericDatumWriter throws exception for nullable schema fields
> --------------------------------------------------------------
>
>                 Key: AVRO-1490
>                 URL: https://issues.apache.org/jira/browse/AVRO-1490
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: csharp
>    Affects Versions: 1.7.6
>         Environment: Windows, C#, .Net 4.5
>            Reporter: Johan Sundstrom
>            Priority: Major
>
> providing sample code and fix
> Sample Schema:
> {code}
> {"namespace": "AvroSample",
>  "type": "record",
>  "name": "User",
>  "fields": [
>      {"name": "name", "type": "string"},
>      {"name": "favorite_number",  "type": ["int", "null"]},
>      {"name": "favorite_color", "type": ["string", "null"]}
>  ]
> }
> {code}
> Sample code to recreate
> {code}
> 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}
> Code that fixes issue:
> {code}
> 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);
>             }
>         }
> }
> {code}



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to