CXONCXON es una interfaz de serialización C ++CXON implementa JSON ( UTF-8 codificado) como un formato de serialización (un ejemplo de un formato de datos basado en texto)CXON implementa CBOR como un formato de serialización (ejemplo de un formato de datos binarios)CXON es fácil de extender para diferentes formatos y tipos con cero overossCXON es una biblioteca de encabezado compacta, compacta y compacta compacta C++11 Aunque CXON es una biblioteca de serialización, su objetivo es competir realmente con JSON / CBOR / etc. Bibliotecas como Boost.JSON / RapidJSON / etc. y su principal ventaja es que no se necesita ningún tipo intermedio para representar los datos: cualquier tipo de C++ que coincida semánticamente se puede usar.
# include " cxon/json.hxx "
# include " cxon/lib/std/vector.hxx " // for <vector>
# include < cassert >
int main () {
std::vector< int > cxx; // or std::array, std::list, std::set, etc.
// the input is a JSON array, semantically a list of integers
auto result = cxon::from_bytes (cxx, " [1, 2, 3] " );
assert (result);
// the data is loaded successfully, no additional semantic validation is needed, so
assert (cxx == (std::vector< int > { 1 , 2 , 3 }));
}La deserialización exitosa significa que la entrada es sintáctica y semánticamente correcta.
Otras bibliotecas de este tipo representan datos arbitrarios con tipo polimórfico (llamado DOM , value , etc.), y el análisis exitoso de los datos de entrada solo significa que es sintácticamente correcto.
// pseudo code
value_type json = json_lib::parse( " [1, 2, 3] " );
assert (json.has_parsing_errors()); // check for syntax errors
// check the semantics, expected is a list of integers
assert (json.is_array()); // check the type
auto & array = json.get_array();
assert ( // check the values
array.size() > ... &&
array[0].is_integer() &&
array[1].is_integer() &&
array[2].is_integer() &&
...
);
// the input is semantically correct, but
// the values still need special attention
int x0 = array[ 0 ].get_integer(); // it's an int, but not quite
... Para ayudar con esto, algunas de las bibliotecas proporcionan utilidades para convertir el tipo de valor en un tipo de C++ - por ejemplo, Boost.JSON proporciona value_from / value_to .
Para completar, CXON también proporciona tipos polimórficos (llamados node ) para los formatos compatibles que coinciden con la funcionalidad proporcionada por estas bibliotecas.
El rendimiento a menudo es importante y es enfatizado por muchas bibliotecas y, a este respecto, CXON está cerca de las alternativas.
Muchas bibliotecas enfatizan el rendimiento de serialización y deserialización del punto flotante. CXON usa <charconv> por defecto (con una implementación de retroceso para C++11 ), pero se puede configurar para usar boost::charconv definiendo CXON_USE_BOOST_CHARCONV .
Tenga en cuenta que las bibliotecas basadas en tipos polimórficos tienen validación y uso de gastos generales que deben tenerse en cuenta.
La gestión de la memoria a menudo es importante. CXON no se asigna en general, depende de los tipos proporcionados.
En el ejemplo anterior, la gestión de la memoria será manejada completamente por std::vector y su asignador.
Los tipos polimórficos proporcionados por CXON cumplen con la asignación.
CXON no está lanzando , siempre que los serializadores involucrados no sean.
CXON define e implementa una interfaz similar a C++17 's <charconv> .
CXON extiende la interfaz de <charconv> con:
Format traits )Interface ) Los rasgos pueden ser con estado o apátridos permitiendo formatos de complejo arbitrario.
Los parámetros nombrados pueden ser tiempo de compilación o tiempo de ejecución que dan flexibilidad para las implementaciones.
Se puede encontrar más sobre la interfaz en el MANUAL .
CXON admite una buena parte de los tipos de biblioteca fundamentales, compuestos y estándar de C++ .
CXON se puede extender para tipos arbitrarios, utilizando métodos intrusivos y no intrusivos.
Se pueden encontrar más detalles en el MANUAL .
JSON La implementación cumple estrictamente con RFC8259 / ECMA-404 .
CXON/JSON también proporciona un tipo polimórfico cxon::json::node , que puede representar datos JSON arbitrarios.
CBOR La implementación cumple con RFC7049 .
CXON/CBOR también proporciona un tipo polimórfico cxon::cbor::node , que puede representar datos arbitrarios CBOR .
CXCF CXCF es un formato de configuración simple derivado de JSON .
Deserialización CXON utilizando la conversión de número predeterminada ( <charconv> ).
Serialización CXON utilizando la conversión de número predeterminada ( <charconv> ).
Tamaño binario CXON y tiempos de compilación.
Se puede encontrar información sobre los puntos de referencia y los resultados de referencia adicionales aquí.
Nota: Boost.json y Rapidjson usan algoritmos de análisis de número más rápido pero ligeramente impreciso por defecto. En los puntos de referencia se prueban con una precisión completa habilitadas.
Dados los resultados de referencia y suponiendo que las bibliotecas con las que se compara CXON está razonablemente bien escrita, se puede decir que CXON satisface el principio de cero.
CXON requiere un compilador compatible con C++11 , probado con g++ >= 5 , clang++ >= 4.0 y msvc++ >= 19.16 (ver las compilaciones).
CXON está utilizando <charconv> para conversiones numéricas si están disponibles.
Si no (por ejemplo, pre- C++17 ) se utilizará una implementación de respaldo (basada en strto* y sprintf ).
Si se define CXON_USE_BOOST_CHARCONV , se utilizará boost::charconv . Esto proporcionará un buen impulso de rendimiento para C++11/14 y algunas implementaciones anteriores de <charconv> .
CXON es una biblioteca de solo encabezado: copie los encabezados que necesita o use el makfile provisto para instalarlo en los sistemas POSIX :
$ sudo make installO ejecute las suites de prueba con:
$ make check Cualquier tipo de contribución (comentarios, sugerencias, código, pruebas, documentación, etc.) es bienvenido.
Póngase en contacto con GitHub (cree un problema incluso es solo una pregunta o comentario) o por correo.
Distribuido bajo la licencia MIT. Vea LICENSE para más información.
Github