nfx-serialization
0.9.3
Cross-platform C++ JSON serialization library with extensible trait capabilities
Main Page
Related Pages
Concepts
Classes
Files
Loading...
Searching...
No Matches
Changelog
[Unreleased]
Added
NIL
Changed
NIL
Deprecated
NIL
Removed
NIL
Fixed
NIL
Security
NIL
[0.9.3] - 2026-02-15
Added
New build option
NFX_SERIALIZATION_ENABLE_SIMD
to control SIMD CPU optimizations (enabled by default)
Automatically propagates to all nfx dependencies (nfx-json, nfx-datatypes, nfx-datetime)
Changed
Updated nfx-json dependency from 1.4.1 to 1.5.0
Updated nfx-containers dependency from 0.5.1 to 0.6.0
Updated nfx-datatypes dependency from 0.4.1 to 0.5.0
Updated nfx-datetime dependency from 0.5.0 to 0.6.0
[0.9.2] - 2026-02-14
Added
New benchmarks for small JSON documents serialization (single object, small array, simple nested structure)
Changed
Updated nfx-json dependency from 1.3.4 to 1.4.1
Updated nfx-containers dependency from 0.4.1 to 0.5.1
Updated nfx-datatypes dependency from 0.4.0 to 0.4.1
Updated nfx-datetime dependency from 0.4.2 to 0.5.0
Added strict compiler warning options (-Wall -Wextra -Werror) for MSVC and GCC/Clang builds
CI now enables benchmarks and samples for all build configurations
Fixed
Improved return logic in serializer for better type handling
[0.9.1] - 2026-02-11
Changed
Updated nfx-json dependency from 1.3.3 to 1.3.4
Updated nfx-datetime dependency from 0.4.1 to 0.4.2
[0.9.0] - 2026-02-08
Added
ContainersTraits
: Added serialization support for
nfx::containers::StackHashMap<K, V, N>
and
nfx::containers::StackHashSet<T, N>
New sample:
Sample_JsonSerializationNfxTypes.cpp
Sections 7-8 demonstrate StackHashMap/StackHashSet usage
Includes unit tests for both containers
Changed
BREAKING
: Updated nfx-containers dependency from 0.3.2 to 0.4.1 (
SmallVector
renamed to
StackVector
)
Updated nfx-json dependency from 1.3.1 to 1.3.3
ContainersTraits
: Updated to use
nfx::containers::StackVector
(renamed from
SmallVector
in nfx-containers 0.4.0)
Fixed
CMake
: Fixed nfx-json dependency always being fetched even when
NFX_SERIALIZATION_WITH_JSON=OFF
Security
NIL
[0.8.1] - 2026-02-06
Changed
Updated nfx-json dependency to 1.3.1 (improves RFC 8259 compliance for forward slash escaping)
[0.8.0] - 2026-02-05
Added
SerializationTraits
: Added factory deserialization pattern support for immutable types
New SFINAE trait
has_factory_deserialization_v<T>
detects static
T fromDocument(const Document&)
method
Enables serialization of types with deleted default constructors (e.g.,
const
members, immutable objects)
Automatic dispatch: factory pattern preferred when available, falls back to mutable pattern for regular types
Supports nested factory deserialization (immutable types containing other immutable types)
New sample:
Sample_JsonSerializationTraits.cpp
Section 4 demonstrates factory pattern usage
[0.7.2] - 2026-02-04
Added
Extension benchmarks for DateTime, Datatypes, and Containers types
Changed
Updated nfx-json from 1.1.2 to 1.2.1 (5-17x Builder performance improvements)
[0.7.1] - 2026-02-03
Changed
Updated nfx-json dependency from 1.1.0 to 1.1.2
Updated nfx-containers dependency from 0.3.1 to 0.3.2 (extension tests)
Updated nfx-datatypes dependency from 0.2.0 to 0.4.0 (extension tests)
Updated nfx-datetime dependency from 0.3.0 to 0.4.1 (extension tests)
Fixed
DateTimeTraits
: Fixed
TimeSpan
serialization to use ISO 8601 duration format instead of int64 ticks
[0.7.0] - 2026-02-01
Added
Serializer
: Added high-performance streaming serialization with Builder API
SerializationTraits now supports optional
serialize(obj, Builder&)
method for streaming JSON generation
Eliminates Document intermediate representation during serialization
SFINAE-based automatic detection via
has_streaming_serialization_v<T>
trait
3-tier dispatch priority: 1. streaming
serialize()
, 2. built-in types, 3. legacy
toDocument()
All extension traits updated with streaming support (ContainersTraits, DatatypesTraits, DateTimeTraits)
New sample:
Sample_JsonSerializerWithBuilder.cpp
demonstrating Builder API usage and performance
New tests:
Tests_JsonSerializerBuilder.cpp
Serializer
: Added native
std::pair<TFirst, TSecond>
support in core serializer
Moved from ContainersTraits extension to built-in Serializer functionality
Serializes as JSON array
[first, second]
for compact representation
Supports nested pairs and containers of pairs
Serializer
: Added native JSON serialization support for
std::tuple<Ts...>
Serializes as JSON array
[elem0, elem1, ...]
matching element order
Supports arbitrary tuple sizes and nested tuples
Enables type-safe heterogeneous collections (e.g.,
tuple<int, string, double>
)
Zero-overhead compile-time recursion using fold expressions and
std::apply
Serializer
: Added native JSON serialization support for
std::multimap
and
std::unordered_multimap
Serializes as JSON array of objects
[{"key": K, "value": V}, ...]
to preserve duplicate keys
Supports heterogeneous key/value types and nested containers
Deserialization preserves all duplicate key-value pairs
Serializer
: Added native JSON serialization support for
std::multiset
and
std::unordered_multiset
Serializes as JSON array
[elem0, elem1, elem2, ...]
allowing duplicate elements
Supports arbitrary element types and nested containers
Deserialization preserves all duplicate elements with correct multiplicity
Serializer
: Added native JSON serialization support for
std::variant<Ts...>
Serializes as JSON object
{"tag": "TypeName", "data": value}
for cross-language interoperability
Type names extracted via compiler intrinsics (
__PRETTY_FUNCTION__
,
__FUNCSIG__
)
Added platform-specific parsing for MSVC:
"type_name<TypeName>(void)"
format
Supports arbitrary variant alternatives including nested variants, containers, and custom types
Compile-time type dispatch using recursive lambda with if-constexpr
Supports
std::monostate
for empty variant state
Serializer
: Added native JSON serialization support for
std::span<T, Extent>
(C++20)
Serialization-only support (non-owning view cannot be deserialized directly)
Serializes as JSON array
[elem0, elem1, ...]
like other sequence containers
Supports both dynamic extent (
std::span<T>
) and fixed extent (
std::span<T, N>
)
Users should deserialize to
std::vector<T>
and create span from it if needed
Serializer
: Added native JSON serialization support for
std::forward_list<T>
Singly-linked list serialized as JSON array (forward-only iteration)
Deserialization uses
push_front()
with automatic reversal to preserve order
Supports roundtrip serialization/deserialization like other sequence containers
ContainersTraits
: Added JSON serialization support for
nfx::containers::OrderedHashMap
Serializes as JSON array of
{"key": K, "value": V}
objects
Preserves insertion order during serialization and deserialization
Supports heterogeneous lookup and all hash types (uint32_t, uint64_t)
ContainersTraits
: Added JSON serialization support for
nfx::containers::OrderedHashSet
Serializes as JSON array of elements
Preserves insertion order during serialization and deserialization
Supports heterogeneous lookup and all hash types (uint32_t, uint64_t)
SerializationTraits
: Added
std::monostate
specialization
Serializes as JSON
null
Enables
std::variant<std::monostate, Ts...>
for nullable variant semantics
Samples
: Added tutorial samples demonstrating progressive JSON serialization workflows
Sample_JsonSerializationBasics.cpp
- Fundamental Document and Builder APIs
Sample_JsonSerializationContainers.cpp
- Automatic STL container serialization
Sample_JsonSerializationTraits.cpp
- Custom type serialization with SerializationTraits
Sample_JsonSerializationStlContainers.cpp
- Comprehensive guide to all 20 STL container types
Sample_JsonSerializationNfxTypes.cpp
- Complete guide to nfx library extension types (11 types from nfx-containers, nfx-datatypes, nfx-datetime)
Changed
Architecture
: Unified SerializationTraits with asymmetric read/write pattern
Write method:
serialize(const T&, Builder&)
- optional streaming serialization (SFINAE-detected)
Read method:
fromDocument(const Document&, T&)
- required DOM-based deserialization
Builder streaming avoids Document overhead
Legacy
toDocument()
method still supported as fallback for compatibility
Breaking
:
SerializationTraits
method signature changes
Deserialization: renamed
deserialize(T&, const Document&)
→
fromDocument(const Document&, T&)
Parameter order: document now comes first for consistency with other APIs
Affects all custom types and extension traits (ContainersTraits, DatatypesTraits, DateTimeTraits)
Breaking
: Removed
toDocument()
and
fromDocument()
from public Serializer API
Serializer now uses
only
toString()
and
fromString()
static methods
Internal serialization streams directly to Builder (no intermediate Document)
SerializationTraits::fromDocument() still used internally for deserialization
Refactor
: Moved
SerializationTraits.h
into
traits/
subfolder
Performance
: Optimized type resolution order in
serializeValue()
for better dispatch
Priority: SerializationTraits::serialize() → Built-in types → Custom toDocument()
Built-in types (bool, int, string, containers) bypass Document intermediate representation
Updated nfx-json dependency from 1.0.3 to 1.1.0 (adds Builder API)
Updated nfx-containers dependency from 0.3.0 to 0.3.1 (extension tests)
Removed
Breaking
: Removed
SerializableDocument
class
Replaced by direct
Serializer<T>::toString()
using Builder internally
Deserialization works directly with nfx::json::Document
Breaking
: Removed
std::pair
support from ContainersTraits extension
std::pair
is now a built-in type in core Serializer (see Added section)
Fixed
Serializer
: Fixed unreachable dead code in
serializeValue()
fallback path
Removed duplicate trait checks that were impossible to reach
Simplified final fallback - compilation fails if type has no serialization support
[0.6.1] - 2026-01-27
Changed
Updated nfx-json dependency from 1.0.2 to 1.0.3
Updated nfx-containers dependency from 0.2.0 to 0.3.0 (extension tests)
Updated Google Benchmark dependency from 1.9.4 to 1.9.5
[0.6.0] - 2026-01-27
Changed
Architecture
: Transitioned to focused C++ serialization library built on nfx-json
nfx-serialization is now header-only (INTERFACE library)
Core dependency: nfx-json 1.0.0 (provides Document, SchemaValidator, SchemaGenerator)
Removed dependency on nfx-stringutils
CMake target:
nfx-serializationnfx-serialization
(header-only interface)
Removed
Breaking
: Extracted JSON core functionality to separate
nfx-json
library
Removed
Document
,
Object
,
Array
,
PathView
classes (now in nfx-json)
Removed
SchemaValidator
and
SchemaGenerator
classes (now in nfx-json)
Removed JSON parsing, manipulation, and validation APIs
nfx-serialization now focuses solely on C++ type ↔ JSON serialization
nfx-json 1.0.0 is now a required dependency
Users must now include
<nfx/json/Document.h>
instead of
<nfx/serialization/json/Document.h>
Namespace changed:
nfx::serialization::json::Document
→
nfx::json::Document
[0.5.0] - 2026-01-12
Added
Document API
: Added
set<T>(path, const char*)
and
set<T, U>(path, U)
overloads for types with explicit constructors
Enables direct setting of types like
Decimal
from string literals:
doc.set<Decimal>("path", "123.456")
Enables direct setting from arithmetic types:
doc.set<Decimal>("path", 2.5)
or
doc.set<Decimal>("path", 42)
Works with any type constructible from
const char*
or arithmetic types (int, float, double, etc.)
Uses C++20 constraints to avoid conflicts with existing JSON value types
ContainersTraits
: Added JSON serialization support for
nfx::containers::SmallVector
ContainersTraits
: Added JSON serialization support for
std::pair<TFirst, TSecond>
Serializes as JSON object with
"first"
and
"second"
fields
Enables serialization of containers like
std::vector<std::pair<K, V>>
Changed
Performance
: Document now uses
std::shared_ptr<Document_impl>
for reference-counted internal data
Document copy constructor and assignment now perform shallow copy (shared ownership) instead of deep copy
Significantly improves iterator performance by eliminating redundant deep copies when dereferencing
Object::Iterator
and
Array::Iterator
Multiple Document instances can share the same underlying JSON data (similar to STL container semantics)
Note: Document follows STL container thread-safety model - concurrent modifications require external synchronization
[0.4.0] - 2026-01-10
Added
Document API
: Added direct
Document::set<T>()
,
Document::get<T>()
, and
Document::is<T>()
support for custom types
nfx extension types via
SerializationTraits
:
Decimal
,
Int128
,
DateTime
,
DateTimeOffset
,
TimeSpan
,
FastHashMap
,
FastHashSet
,
PerfectHashMap
STL types via
Serializer<T>
:
std::vector
,
std::map
,
std::set
,
std::list
,
std::deque
,
std::unique_ptr
,
std::shared_ptr
,
std::optional
Supports nested containers (e.g.,
std::vector<std::vector<int>>
)
Type traits for template selection:
has_serialization_traits
,
is_nfx_extension_type
Concepts
: Updated
JsonValue
concept to exclude types with
SerializationTraits
specializations for proper template overload resolution
Changed
Breaking
: Updated
DateTimeTraits.h
to use
nfx-datetime
0.2.0 consolidated formatting API
Replaced deprecated
toIso8601Extended()
with
toString(DateTime::Format::Iso8601Precise)
DateTime serialization now outputs fractional seconds with exactly 7 digits (tick precision) instead of stripping trailing zeros
DateTimeOffset serialization now uses explicit offset format (±HH:MM) instead of 'Z' notation for UTC
### Fixed
Serializer
: Fixed silent type conversion during deserialization
Now throws exceptions when primitive type deserialization fails (e.g., int to string)
Prevents
std::vector<int>
from being incorrectly deserialized as
std::vector<std::string>
with empty strings
Ensures
is<T>()
correctly rejects incompatible types
[0.3.0] - 2025-12-20
Added
Tests
: Added tests for nested
Object
and
Array
access via
get<Object>()
and
get<Array>()
methods
Removed
Breaking
: Removed
std::string_view
support from
Document
,
Object
, and
Array
classes
get<std::string_view>()
,
set<std::string_view>()
, and
append<std::string_view>()
are no longer available
This API created dangling references by returning views to temporary strings
Breaking
: Removed
Serializer<T>
instance methods
serializeToString()
and
deserializeFromString()
These methods were redundant - use static methods
Serializer<T>::toString()
and
Serializer<T>::fromString()
instead
Instance methods
serialize()
and
deserialize()
(working with
Document
) are still available
Fixed
Critical
: Fixed dangling pointer bugs in
Object::get<Object>(path)
and
Object::get<Array>(path)
methods
These methods were creating temporary
Document
objects and returning
Object
/
Array
wrappers with pointers to the temporaries
After function return, the temporary was destroyed, leaving dangling pointers causing undefined behavior and segmentation faults
Now correctly returns
Object
/
Array
with references to the parent document and proper path
Critical
: Fixed dangling pointer bugs in
Array::get<Object>(path)
and
Array::get<Array>(path)
methods
Same issue as above - temporary documents were being destroyed after return
Now correctly returns
Object
/
Array
with references to the parent document and proper path
[0.2.0] - 2025-11-30
Added
nfx-stringutils dependency
: Added nfx-stringutils as a FetchContent dependency for string validation functions
Changed
Format validation
: Replaced all
std::regex
usage with constexpr
nfx::string::
functions for ~50% performance improvement
SchemaGenerator
: Improved IDN/IRI detection for email, hostname, and URI format inference
Removed
Regex.h
: Deleted
nfx::serialization::json::regex
namespace (replaced by nfx-stringutils)
[0.1.0] - 2025-11-30 - Initial Release
Added
Document
: JSON document abstraction with JSON Pointer path support
Type-safe value access (
get<T>
,
set<T>
,
has
,
remove
)
Nested object and array operations
Factory methods (
fromJsonString
,
fromFile
)
Iterator support for arrays and object fields (
Array
,
Object
,
PathView
)
Comparison operators and copy/move semantics
SchemaValidator
: JSON Schema Draft 2020-12 validation
Comprehensive type and constraint validation
Format validation (date-time, email, URI, UUID, IPv4/IPv6, etc.)
Schema composition (
allOf
,
anyOf
,
oneOf
,
not
,
if/then/else
)
$ref
and
$anchor
resolution
Detailed error reporting with
ValidationResult
and
ValidationError
Configurable via Options struct (
strictMode
,
maxDepth
)
SchemaGenerator
: JSON Schema Draft 2020-12 generation from samples
Single and multi-sample analysis
Format detection (email, date, URI, UUID, etc.)
Constraint inference (
minLength
,
minimum
,
maximum
,
pattern
)
Enum detection from limited value sets
Configurable via Options struct
Serializer
: Templated JSON serialization with automatic type mapping
Compile-time type detection and field mapping
Support for POD types, containers, and nested structures
toJson
/
fromJson
static convenience methods
serialize
/
deserialize
instance methods
Configurable via Options struct
Documentation
README with feature overview
Detailed API documentation with Doxygen comments
Sample application demonstrating library usage
Build and installation instructions
Testing & Benchmarking
Unit test suite
Performance benchmarks for all operations
Cross-compiler performance validation
Generated by
1.15.0