serialization_format Enum
namespace keychain
→ enum class serialization_format
Overview
The serialization_format
enumeration specifies different data serialization formats supported by Keychain Core for data exchange, storage, and interoperability.
Syntax
namespace keychain {
enum class serialization_format {
XML, // Extensible Markup Language
JSON, // JavaScript Object Notation
PROTOBUF, // Protocol Buffers (binary)
BINARY // Native binary format
};
}
Members
XML
Value: serialization_format::XML
Extensible Markup Language - structured markup format.
Characteristics: * Human-readable text format * Self-describing with schema validation * Extensive tooling support * Larger payload size * Good for document-oriented data
Advantages: * Wide industry support * Schema validation capabilities * Namespace support * Human-readable for debugging
Disadvantages: * Verbose syntax * Larger message sizes * Slower parsing performance
JSON
Value: serialization_format::JSON
JavaScript Object Notation - lightweight data-interchange format.
Characteristics: * Human-readable text format * Simple syntax and structure * Native JavaScript support * Moderate payload size * Excellent web compatibility
Advantages: * Lightweight and fast parsing * Ubiquitous support across languages * Human-readable * Web API standard
Disadvantages: * Limited data types * No schema validation (without additional tools) * No comments support
PROTOBUF
Value: serialization_format::PROTOBUF
Protocol Buffers - Google’s language-neutral serialization mechanism.
Characteristics: * Binary format (not human-readable) * Compact and efficient * Strong typing with schema * Cross-language compatibility * Excellent performance
Advantages: * Very compact binary format * Fast serialization/deserialization * Strong typing and versioning * Code generation for multiple languages
Disadvantages: * Not human-readable * Requires schema definition * Binary compatibility concerns
BINARY
Value: serialization_format::BINARY
Native binary format optimized for Keychain Core.
Characteristics: * Proprietary binary format * Maximum efficiency * Optimized for Keychain data types * Smallest payload size * Fastest processing
Advantages: * Optimal performance for Keychain operations * Minimal overhead * Type-specific optimizations * Version-aware format
Disadvantages: * Not human-readable * Keychain-specific format * Limited interoperability
Usage
#include <keychain/keychain.h>
// Serialize data in different formats
keychain::serialized_data data;
data.set_value("Hello, World!");
// Convert to different formats
std::string xml_output = data.serialize(keychain::serialization_format::XML);
std::string json_output = data.serialize(keychain::serialization_format::JSON);
std::vector<uint8_t> protobuf_output = data.serialize_binary(keychain::serialization_format::PROTOBUF);
std::vector<uint8_t> binary_output = data.serialize_binary(keychain::serialization_format::BINARY);
// Deserialize from different formats
keychain::serialized_data from_xml;
from_xml.deserialize(xml_output, keychain::serialization_format::XML);
keychain::serialized_data from_json;
from_json.deserialize(json_output, keychain::serialization_format::JSON);
// Check format compatibility
bool supports_format(keychain::serialization_format format) {
switch (format) {
case keychain::serialization_format::XML:
case keychain::serialization_format::JSON:
case keychain::serialization_format::PROTOBUF:
case keychain::serialization_format::BINARY:
return true;
default:
return false;
}
}
Format Comparison
Format | Human Readable | Size | Speed | Interoperability | Schema Support |
---|---|---|---|---|---|
XML |
✓ |
Large |
Slow |
Excellent |
✓ (XSD) |
JSON |
✓ |
Medium |
Fast |
Excellent |
Limited (JSON Schema) |
PROTOBUF |
✗ |
Small |
Very Fast |
Good |
✓ (Native) |
BINARY |
✗ |
Smallest |
Fastest |
Limited |
✓ (Native) |
Example Outputs
XML Format
<?xml version="1.0" encoding="UTF-8"?>
<serializedData>
<type>STRING</type>
<value>Hello, World!</value>
<metadata>
<created>2024-01-15T10:30:00Z</created>
<version>3.0</version>
</metadata>
</serializedData>
Performance Characteristics
// Performance benchmark example
void benchmark_serialization_formats() {
keychain::serialized_data large_data;
// Fill with 10MB of test data
auto benchmark_format = [&](keychain::serialization_format format) {
auto start = std::chrono::high_resolution_clock::now();
// Serialize
auto serialized = large_data.serialize(format);
// Deserialize
keychain::serialized_data deserialized;
deserialized.deserialize(serialized, format);
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << "Format " << to_string(format)
<< ": " << duration.count() << "ms, "
<< "Size: " << serialized.size() << " bytes" << std::endl;
};
benchmark_format(keychain::serialization_format::XML);
benchmark_format(keychain::serialization_format::JSON);
benchmark_format(keychain::serialization_format::PROTOBUF);
benchmark_format(keychain::serialization_format::BINARY);
}
Use Case Recommendations
XML Format
Best for: * Enterprise integration * Document-oriented data * Strong schema validation requirements * Legacy system compatibility
Example:
// Configuration files, enterprise APIs
keychain::serialization_format config_format = keychain::serialization_format::XML;
JSON Format
Best for: * Web APIs and services * Human-readable configuration * JavaScript applications * RESTful interfaces
Example:
// Web API responses, configuration files
keychain::serialization_format api_format = keychain::serialization_format::JSON;
Migration and Versioning
// Handle format migration
keychain::serialized_data migrate_format(
const keychain::serialized_data& data,
keychain::serialization_format from_format,
keychain::serialization_format to_format) {
// Serialize in old format
auto serialized = data.serialize(from_format);
// Deserialize and re-serialize in new format
keychain::serialized_data migrated;
migrated.deserialize(serialized, from_format);
return migrated;
}
// Version-aware deserialization
keychain::serialized_data deserialize_with_fallback(
const std::string& data_str,
const std::vector<keychain::serialization_format>& formats) {
for (auto format : formats) {
try {
keychain::serialized_data result;
result.deserialize(data_str, format);
return result;
} catch (const std::exception&) {
continue; // Try next format
}
}
throw std::runtime_error("Unable to deserialize with any supported format");
}
Related Types
-
data_type - Data type enumeration for serialized content
-
serialized_data - Serializable data containers
-
char_encoding - Character encoding options
See Also
-
gateway - Data serialization operations
-
{json-spec}[JSON Specification (RFC 7159)]
-
{xml-spec}[XML 1.0 Specification]
-
{protobuf-guide}[Protocol Buffers Developer Guide]