diff --git a/src/serialization.jl b/src/serialization.jl index f18ec14b1..f9999a905 100644 --- a/src/serialization.jl +++ b/src/serialization.jl @@ -265,6 +265,16 @@ 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} 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"]) deserialize(::Type{Complex{T}}, data::Dict) where {T} = diff --git a/test/test_serialization.jl b/test/test_serialization.jl index b6fcc8810..fcdfbe18f 100644 --- a/test/test_serialization.jl +++ b/test/test_serialization.jl @@ -72,6 +72,32 @@ 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 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)