CXONCXON est une interface de sérialisation C ++CXON implémente JSON ( UTF-8 encodé) comme format de sérialisation (un exemple de format de données basé sur le texte)CXON implémente CBOR comme format de sérialisation (exemple de format de données binaires)CXON est facile à étendre pour différents formats et types avec zéro overheadCXON est une bibliothèque d'en-tête conforme C++11 Bien que CXON soit une bibliothèque de sérialisation, son objectif est de rivaliser avec JSON / CBOR / etc. Des bibliothèques comme Boost.JSON / RapidJSON / etc. Et son principal avantage est qu'aucun type intermédiaire n'est nécessaire pour représenter les données - tout type C++ qui le correspond sémantique peut être utilisé.
# 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 désérialisation réussie signifie que l'entrée est syntaxiquement et sémantiquement correcte.
D'autres bibliothèques représentent des données arbitraires avec un type polymorphe (appelé DOM , value , etc.), et l'analyse réussie des données d'entrée signifie seulement qu'elle est syntaxiquement correcte.
// 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
... Pour aider à cela, certaines bibliothèques fournissent des utilitaires pour convertir le type de valeur en type C++ - par exemple Boost.JSON fournit value_from / value_to .
Pour l'exhaustivité, CXON fournit également des types polymorphes (appelés node ) pour les formats pris en charge qui correspondent aux fonctionnalités fournies par ces bibliothèques.
La performance est souvent importante et est soulignée par de nombreuses bibliothèques et à cet égard, CXON est proche des alternatives.
De nombreuses bibliothèques mettent l'accent sur les performances de sérialisation et de désérialisation à virgule flottante. CXON utilise <charconv> par défaut (avec une implémentation de secours pour C++11 ), mais peut être configuré pour utiliser boost::charconv en définissant CXON_USE_BOOST_CHARCONV .
Notez que les bibliothèques basées sur les types polymorphes ont une validation et des frais généraux qui doivent être pris en compte.
La gestion de la mémoire est souvent importante. CXON n'attribue pas en général, il appartient aux types fournis.
Dans l'exemple ci-dessus, la gestion de la mémoire sera complètement gérée par std::vector et son allocateur.
Les types polymorphes fournis par CXON sont conformes à l'allocatorware.
CXON est non lancé , à condition que les sérialiseurs impliqués ne lancent pas.
CXON définit et implémente une interface similaire à C++17 de <charconv> .
CXON étend l'interface de <charconv> avec:
Format traits )Interface ) Les traits peuvent être avec état ou sans état permettant des formats complexes arbitraires.
Les paramètres nommés peuvent être le temps ou le temps d'exécution, ce qui donne la flexibilité des implémentations.
En savoir plus sur l'interface se trouve dans le MANUAL .
CXON prend en charge une bonne partie des types de bibliothèque fondamentaux, composés et standard de C++ .
CXON peut être étendu pour les types arbitraires, en utilisant des méthodes intrusives et non intrusives.
Plus de détails peuvent être trouvés dans le MANUAL .
JSON La mise en œuvre est strictement conforme à RFC8259 / ECMA-404 .
CXON/JSON fournit également un type polymorphe cxon::json::node , qui peut représenter des données JSON arbitraires.
CBOR L'implémentation est conforme à RFC7049 .
CXON/CBOR fournit également un type polymorphe cxon::cbor::node , qui peut représenter des données CBOR arbitraires.
CXCF CXCF est un format de configuration simple dérivé de JSON .
CXON Desérialisation à l'aide de la conversion de nombre par défaut ( <charconv> ).
Sérialisation CXON à l'aide de la conversion de nombre par défaut ( <charconv> ).
Taille binaire CXON et temps de compilation.
Des informations sur les repères et les résultats de référence supplémentaires peuvent être trouvés ici.
Remarque: Boost.json et RapidJson utilisent des algorithmes d'analyse de numéro plus rapides mais légèrement imprécis par défaut. Dans les repères, ils sont testés avec une précision complète activée.
Compte tenu des résultats de référence et en supposant que les bibliothèques CXON sont comparées sont raisonnablement bien écrites, on peut dire que CXON satisfait le principe zéro-overhead.
CXON nécessite un compilateur conforme C++11 , testé avec g++ >= 5 , clang++ >= 4.0 et msvc++ >= 19.16 (voir les builds).
CXON utilise <charconv> pour les conversions numériques si disponibles.
Sinon (Ex. Pre- C++17 ) Une implémentation de repli (basée sur strto* et sprintf ) sera utilisée.
Si CXON_USE_BOOST_CHARCONV est défini, boost::charconv sera utilisé. Cela fournira une bonne augmentation des performances pour C++11/14 et certaines implémentations antérieures de <charconv> .
CXON est une bibliothèque d'en-tête uniquement - Copiez les en-têtes dont vous avez besoin, ou utilisez le Fourni MakingFile pour l'installer sur les systèmes POSIX :
$ sudo make installou exécutez les suites de test avec:
$ make check Tout type de contribution (commentaires, suggestions, code, tests, documentation, etc.) est le bienvenu.
Contactez via GitHub (créez un problème même c'est juste une question ou un commentaire) ou par courrier.
Distribué sous la licence du MIT. Voir LICENSE pour plus d'informations.
Github