Details
Description
Encoding an object with a recursive schema fails when using a jsonEncoder or a validatingEncoder. Here is an example:
Output:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_weak_ptr> >' what(): tr1::bad_weak_ptr
container.json
{ "name": "Container", "doc": "Container to demonstrate the weak_ptr exception.", "type": "record", "fields": [{ "name": "field", "type": { "name": "Object", "type": "record", "fields": [{ "name": "value", "type": [ "string", {"type": "map", "values": "Object"} ] }] } }] }
example.cc
#include <fstream> #include <avro/Compiler.hh> #include <avro/Encoder.hh> #include <avro/Stream.hh> #include <avro/ValidSchema.hh> #include "container.hh" int main() { std::ifstream ifs("container.json"); avro::ValidSchema schema; avro::compileJsonSchema(ifs, schema); std::auto_ptr<avro::OutputStream> out = avro::memoryOutputStream(); // Either one fails, here we use the jsonEncoder // avro::EncoderPtr encoder = avro::jsonEncoder(schema); avro::EncoderPtr encoder = avro::validatingEncoder(schema, avro::binaryEncoder()); // An encoder that doesn't know the schema works fine // avro::EncoderPtr encoder = avro::binaryEncoder(); encoder->init(*out); Container container; std::map<std::string, Object > object; // Note that it doesn't fail if we don't insert a value into the map object["a"].value.set_string("x"); container.field.value.set_map(object); avro::encode(*encoder, container); return 0; }
Attachments
Issue Links
- links to