From e64ab215ff253e01f4c9ecc2166dec1473614249 Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Mon, 4 May 2026 14:18:44 -0600 Subject: [PATCH 1/3] add new serialization and test --- src/serialization.jl | 7 +++++++ test/test_serialization.jl | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/serialization.jl b/src/serialization.jl index f18ec14b1..37a638719 100644 --- a/src/serialization.jl +++ b/src/serialization.jl @@ -265,6 +265,13 @@ serialize(uuids::Vector{Base.UUID}) = serialize.(uuids) serialize(uuids::Set{Base.UUID}) = serialize.(uuids) deserialize(::Type{Base.UUID}, data::Dict) = Base.UUID(data["value"]) +# IS serializes a Base.UUID as Dict("value" => string). The default +# deserialize(::Type{T}, ::Any) = deepcopy(data) leaves the dicts unconverted, +# so structs with Vector{Base.UUID} fields (e.g. Outage.monitored_components) +# would receive Vector{Dict} at construction time. Convert each element here. +deserialize(::Type{Vector{Base.UUID}}, data::AbstractVector) = + Base.UUID[deserialize(Base.UUID, x) for x in data] + serialize(value::Complex) = Dict("real" => real(value), "imag" => imag(value)) deserialize(::Type{Complex}, data::Dict) = Complex(data["real"], data["imag"]) deserialize(::Type{Complex{T}}, data::Dict) where {T} = diff --git a/test/test_serialization.jl b/test/test_serialization.jl index b6fcc8810..9ee591667 100644 --- a/test/test_serialization.jl +++ b/test/test_serialization.jl @@ -72,6 +72,19 @@ end @test IS.serialize(nt_result) == nt_data end +@testset "Test Vector{Base.UUID} Serialization/Deserialization" begin + uuids = [Base.UUID(rand(UInt128)) for _ in 1:3] + serialized = IS.serialize(uuids) + @test serialized isa Vector{<:Dict} + @test all(d -> haskey(d, "value"), serialized) + deserialized = IS.deserialize(Vector{Base.UUID}, serialized) + @test deserialized isa Vector{Base.UUID} + @test deserialized == uuids + # Round-trip through JSON to mimic on-disk format. + json_round_trip = JSON3.read(JSON3.write(serialized), Vector{Dict}) + @test IS.deserialize(Vector{Base.UUID}, json_round_trip) == uuids +end + @testset "Test JSON serialization of system data" begin for in_memory in (true, false) sys = create_system_data_shared_time_series(; time_series_in_memory = in_memory) From 9876c6643cfa82ebee3198271e4b443f609e748e Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Tue, 5 May 2026 18:14:21 -0600 Subject: [PATCH 2/3] add method for Type{Set{Base.UUID}} --- src/serialization.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/serialization.jl b/src/serialization.jl index 37a638719..f9999a905 100644 --- a/src/serialization.jl +++ b/src/serialization.jl @@ -267,10 +267,13 @@ deserialize(::Type{Base.UUID}, data::Dict) = Base.UUID(data["value"]) # IS serializes a Base.UUID as Dict("value" => string). The default # deserialize(::Type{T}, ::Any) = deepcopy(data) leaves the dicts unconverted, -# so structs with Vector{Base.UUID} fields (e.g. Outage.monitored_components) -# would receive Vector{Dict} at construction time. Convert each element here. +# so structs with Vector{Base.UUID} or Set{Base.UUID} fields +# (e.g. Outage.monitored_components) would receive Vector{Dict} at construction +# time. Convert each element here. deserialize(::Type{Vector{Base.UUID}}, data::AbstractVector) = Base.UUID[deserialize(Base.UUID, x) for x in data] +deserialize(::Type{Set{Base.UUID}}, data::AbstractVector) = + Set{Base.UUID}(deserialize(Base.UUID, x) for x in data) serialize(value::Complex) = Dict("real" => real(value), "imag" => imag(value)) deserialize(::Type{Complex}, data::Dict) = Complex(data["real"], data["imag"]) From b982476cc69bcce0b308b4d2751da8feed66c911 Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Tue, 12 May 2026 15:34:20 -0600 Subject: [PATCH 3/3] add suggested test --- test/test_serialization.jl | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/test_serialization.jl b/test/test_serialization.jl index 9ee591667..fcdfbe18f 100644 --- a/test/test_serialization.jl +++ b/test/test_serialization.jl @@ -85,6 +85,19 @@ end @test IS.deserialize(Vector{Base.UUID}, json_round_trip) == uuids end +@testset "Test Set{Base.UUID} Serialization/Deserialization" begin + uuids = Set(Base.UUID(rand(UInt128)) for _ in 1:3) + serialized = IS.serialize(uuids) + @test serialized isa Vector{<:Dict} + @test all(d -> haskey(d, "value"), serialized) + deserialized = IS.deserialize(Set{Base.UUID}, serialized) + @test deserialized isa Set{Base.UUID} + @test deserialized == uuids + # Round-trip through JSON to mimic on-disk format. + json_round_trip = JSON3.read(JSON3.write(serialized), Vector{Dict}) + @test IS.deserialize(Set{Base.UUID}, json_round_trip) == uuids +end + @testset "Test JSON serialization of system data" begin for in_memory in (true, false) sys = create_system_data_shared_time_series(; time_series_in_memory = in_memory)