Доброго времени суток, коллеги.
Я столкнулся с одной проблемкой, которая на первый взгляд мне показалась смешной, но вот прошло уже много часов, и уже не смешно.
Суть:
в рамках фреймворка , который мы пишем на проекте (кстати, если кому интересен IOT - то вот чем мы занимаемся
www.kaaproject.org/) используется Apache Avro для конвертации , генерации и валидации схем.
У нас есть некие идентификаторы "uuid", которые генерятся и записываются прямо в эти схемы, для однозначной идентификации разных records.
Но вот задачка в том, что эти идентификаторы в рамках либы Apache Avro записываются в виде бинарных данных (byte[]) в кодировке Latin-1. И вот теперь просто представьте себе, на выходе мы имеем все схемы, которые хранятся в виде джейсонов, которые всем прекрасны, кроме того, что все поля "uuid": "...some bin data in latin-1..." . Получается смесь двух кодировок : UTF-8 & Latin-1.
Отсюда растет другая проблема, если мы экспортируем схему, а потом пытаемся её заимпортить назад - нам нужно парсить этот JSON для валидации некоторых моментов. Но мы имеем невалидный JSON , так как спецификация говорит, что JSON должен быть исключительно в UTF кодировке.
Библиотеки, которые умеют парсить JSONы либо валятся с исключениями ,что там не UTF-8 , либо искажают Latin-1 , что превращает этот идентификатор в абсолютно другой. Моя задача такая - взять byte[] , распарсить его как JSON, пробежать по нодам, кой-чего проверить, вставить и удалить и опять вернуться byte[] никак не искажая существующие идентификаторы в Latin-1 .
Я думал пойти по другому пути - написать класс-наследник для Avro JsonDecoder (который и создает проблему этой кодировкой), но оказалось там закрытые конструторы или пакетного уровня. Думал сделать обертку - но опять, этот класс так используется, что мне нужные некоторые его методы, которые я не могу переопределить. А в некоторых местах мне бы понадобилось имплементить некоторые интерфейсы, уверен за этим потянулась бы вереница зависимостей ))
Буду признателен за любые идеи, как решить эту задачу!