Hi Anton, I don't see any unit tests / examples for this at https://github.com/apache/avro/tree/master/lang/c%2B%2B/ test|examples, so I guess it is not implemented yet. You could add an entry for basicSchemas ( https://github.com/apache/avro/blob/1aa963c44d1b9da3dfcf74acb3eeed56439332a0/lang/c%2B%2B/test/SchemaTests.cc#L30) and if it fails then create an issue / PR.
On Wed, Dec 22, 2021 at 10:13 AM Anton <anton...@yandex.ru> wrote: > Hello, I have problem with serialization of data having optional fields. > When I pass null in corresponding field it works but when it is non-null > then serialization fails. > > Schema: > > { > > "type": "record", > > "name": "schema", > > "namespace": "space", > > "fields": [ > > { > > "name": "username", > > "type": "string" > > }, > > { > > "name": "data", > > "type": [ > > "null", > > "string" > > ], > > "defaults": null > > }, > > { > > "name": "timestamp", > > "type": "long" > > } > > ] > > } > > > > Data that works: > > {"username":"miguno","data":null,"timestamp": 1366150681 } > > > > Data that fails: > > {"username":"miguno","data":"test","timestamp": 1366150681 } > > > > Should it work or I have some error in my schema? I didn’t find any active > issues in jira so I guess the concept of optional fields should work just > fine, also in C++. > > > > The code is: > > > > std::unique_ptr<avro::InputStream> in = avro::memoryInputStream((const > uint8_t*)&json[0], json.size()); // json is incoming data > > avro::ValidSchema validSchema; > > std::istringstream ins(schema); // schema is avro-schema > > try { > > avro::compileJsonSchema(ins, validSchema); > > } > > catch (const std::exception& e1) { > > std::string errstr = e1.what(); > > } > > avro::DecoderPtr jd = avro::jsonDecoder(validSchema); > > avro::GenericDatum datum(validSchema); > > jd->init(*in); > > avro::decode(*jd, datum); //serialization with non-null data fails > somewhere inside this step >