Я пытаюсь использовать библиотеку C ++ avro в нашем программном обеспечении, и я столкнулся с серьезной проблемой. У меня есть класс «Value», который охватывает диапазон типов, и я хочу использовать avro для чтения / записи. Это включает не только простые типы, но и std :: векторы типов, произвольные классы и многое другое.
Я пытаюсь указать схему avro для моего класса «Value». В моем примере я ограничил его пустыми, int, long, массивами int и массивами long.
Моя схема представляет собой запись с двумя полями, одно из которых идентифицирует содержащийся тип, и объединение для хранения содержащегося объекта. Схема у меня для него следующая …
{
"type": "record",
"name": "Value",
"fields": [
{
"name": "ilk",
"type": "string"},
{
"name": "contents",
"type": [
"null",
"boolean",
"int",
{
"type": "array",
"items": "int"},
"long",
{
"type": "array",
"items": "long"}
]
}
]
}
Я не указываю JSON, но создаю иерархию схемы avro C ++, которая распечатывает вышеперечисленное. Проверить эту иерархию схемы не удается. Обнюхивая код C ++, вы перестаете иметь в объединении более одного массива или карты, даже если типы в массиве или карте отличаются.
Это на самом деле является частью стандарта Avro или это ошибка в реализации C ++? Я понимаю, что указывать один и тот же тип дважды глупо, но я бы не подумал, что будут разрешены массивы и карты с различными содержащимися типами.
Нашел мой ответ в стандарте. Вы не можете иметь более одного массива или карты внутри объединения.
Звучит несколько глупо для меня, поэтому мне придется найти грязную работу вокруг.
Я на самом деле не думаю, что это то, что вы хотите сделать. То, что вы хотите сделать, это создать массив, который имеет разные типы. Как это.
{
"namespace": "example.avro",
"type": "record",
"name": "Example",
"fields": [
{
"name": "values",
"type":
{
"type": "array",
"items": ["int", "string"]
}
}
]
}
Это создаст массив, который может иметь два простых типа. Либо «int» или «строка». Вы можете вставить любой сложный тип там.