John,

 

There was “default” originally. I changed it to “defaults” after I’ve met such 
spelling in some stackoverflow answer. None of variants worked for nonempty 
data-field.

 

From: John McClean [mailto:jmccl...@gmail.com] 
Sent: Wednesday, December 22, 2021 8:11 PM
To: user@avro.apache.org
Subject: Re: Serialization with optional fields using C++ library

 

I only skimmed this, but the schema should read "default", not "defaults". I've 
no idea if that's the only issue.

 

J

 

On Wed, Dec 22, 2021 at 8:40 AM Anton <anton...@yandex.ru 
<mailto:anton...@yandex.ru> > wrote:

Hi Martin,

 

SchemaTests.cc checks only test compilation and my schema compiles fine 
according to my code.

Is there any test that checks full cycle of serialization/deserialization 
process with json/schema provided?

 

 

From: Martin Grigorov [mailto:mgrigo...@apache.org 
<mailto:mgrigo...@apache.org> ] 
Sent: Wednesday, December 22, 2021 3:24 PM
To: user@avro.apache.org <mailto:user@avro.apache.org> 
Subject: Re: Serialization with optional fields using C++ library

 

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 
<mailto: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

Reply via email to