JuliaIO / JLD2.jl

HDF5-compatible file format in pure Julia
Other
553 stars 88 forks source link

Reconstruction of UnionAll type parameters #538

Closed lhupe closed 8 months ago

lhupe commented 8 months ago

MWE

Create a file using

using JLD2
struct Foo{T}
    val
end
jldsave("test.jld2", test = Foo{Foo}(4))

then load in a new session without the type definitions

using JLD2
load("test.jld2")

which results in a verbose error message

``` ┌ Error: Exception while generating log record in module JLD2 at /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/data/reconstructing_datatypes.jl:607 │ exception = │ MethodError: no method matching typestring(::Type{JLD2.UnknownType{JLD2.UnknownType{Symbol("Main.Foo"), Tuple{T}}, Tuple{T}} where T}) │ │ Closest candidates are: │ typestring(::Type{JLD2.UnknownType{T, P}}) where {T, P} │ @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/data/reconstructing_datatypes.jl:502 │ │ Stacktrace: │ [1] typestring(::Type{JLD2.UnknownType{Symbol("Main.Foo"), Tuple{JLD2.UnknownType{JLD2.UnknownType{Symbol("Main.Foo"), Tuple{T}}, Tuple{T}} where T}}}) │ @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/data/reconstructing_datatypes.jl:512 │ [2] macro expansion │ @ ./logging.jl:372 [inlined] │ [3] constructrr(f::JLD2.JLDFile{JLD2.MmapIO}, unk::Type{JLD2.UnknownType{Symbol("Main.Foo"), Tuple{JLD2.UnknownType{JLD2.UnknownType{Symbol("Main.Foo"), Tuple{T}}, Tuple{T}} where T}}}, dt::JLD2.CompoundDatatype, attrs::Vector{JLD2.ReadAttribute}) │ @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/data/reconstructing_datatypes.jl:607 │ [4] jltype(f::JLD2.JLDFile{JLD2.MmapIO}, cdt::JLD2.CommittedDatatype) │ @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/data/reconstructing_datatypes.jl:116 │ [5] read_data(f::JLD2.JLDFile{JLD2.MmapIO}, dataspace::JLD2.ReadDataspace, datatype_class::UInt8, datatype_offset::Int64, layout::JLD2.DataLayout, filters::JLD2.FilterPipeline, header_offset::JLD2.RelOffset, attributes::Vector{JLD2.ReadAttribute}) │ @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/datasets.jl:183 │ [6] load_dataset(f::JLD2.JLDFile{JLD2.MmapIO}, offset::JLD2.RelOffset) │ @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/datasets.jl:125 │ [7] getindex(g::JLD2.Group{JLD2.JLDFile{JLD2.MmapIO}}, name::String) │ @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/groups.jl:109 │ [8] getindex │ @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/JLD2.jl:494 [inlined] │ [9] loadtodict!(d::Dict{String, Any}, g::JLD2.JLDFile{JLD2.MmapIO}, prefix::String) │ @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/loadsave.jl:155 │ [10] loadtodict! │ @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/loadsave.jl:154 [inlined] │ [11] fileio_load(f::FileIO.File{FileIO.DataFormat{:JLD2}, String}; nested::Bool, kwargs::@Kwargs{}) │ @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/fileio.jl:43 │ [12] fileio_load(f::FileIO.File{FileIO.DataFormat{:JLD2}, String}) │ @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/fileio.jl:37 │ [13] #invokelatest#2 │ @ Base ./essentials.jl:887 [inlined] │ [14] invokelatest │ @ Base ./essentials.jl:884 [inlined] │ [15] action(::Symbol, ::Vector{Union{Base.PkgId, Module}}, ::FileIO.Formatted; options::@Kwargs{}) │ @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:219 │ [16] action │ @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:196 [inlined] │ [17] action │ @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:185 [inlined] │ [18] load(::String; options::@Kwargs{}) │ @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:113 │ [19] load(::String) │ @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:109 │ [20] top-level scope │ @ REPL[2]:1 │ [21] eval │ @ Core ./boot.jl:385 [inlined] │ [22] eval_user_input(ast::Any, backend::REPL.REPLBackend, mod::Module) │ @ REPL ~/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:150 │ [23] repl_backend_loop(backend::REPL.REPLBackend, get_module::Function) │ @ REPL ~/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:246 │ [24] start_repl_backend(backend::REPL.REPLBackend, consumer::Any; get_module::Function) │ @ REPL ~/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:231 │ [25] run_repl(repl::REPL.AbstractREPL, consumer::Any; backend_on_current_task::Bool, backend::Any) │ @ REPL ~/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:389 │ [26] run_repl(repl::REPL.AbstractREPL, consumer::Any) │ @ REPL ~/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:375 │ [27] (::Base.var"#1013#1015"{Bool, Bool, Bool})(REPL::Module) │ @ Base ./client.jl:432 │ [28] #invokelatest#2 │ @ Base ./essentials.jl:887 [inlined] │ [29] invokelatest │ @ Base ./essentials.jl:884 [inlined] │ [30] run_main_repl(interactive::Bool, quiet::Bool, banner::Bool, history_file::Bool, color_set::Bool) │ @ Base ./client.jl:416 │ [31] exec_options(opts::Base.JLOptions) │ @ Base ./client.jl:333 │ [32] _start() │ @ Base ./client.jl:552 └ @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/data/reconstructing_datatypes.jl:607 Error encountered while load FileIO.File{FileIO.DataFormat{:JLD2}, String}("test.jld2"). Fatal error: ERROR: MethodError: no method matching shorttypestring(::Type{JLD2.UnknownType{JLD2.UnknownType{Symbol("Main.Foo"), Tuple{T}}, Tuple{T}} where T}) Closest candidates are: shorttypestring(::Type{JLD2.UnknownType{T, P}}) where {T, P} @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/data/reconstructing_datatypes.jl:529 Stacktrace: [1] fileio_load(f::FileIO.File{FileIO.DataFormat{:JLD2}, String}; nested::Bool, kwargs::@Kwargs{}) @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/fileio.jl:46 [2] fileio_load(f::FileIO.File{FileIO.DataFormat{:JLD2}, String}) @ JLD2 /data.lmp/lhupe/.julia/packages/JLD2/oYEEg/src/fileio.jl:37 [3] #invokelatest#2 @ Base ./essentials.jl:887 [inlined] [4] invokelatest @ Base ./essentials.jl:884 [inlined] [5] action(::Symbol, ::Vector{Union{Base.PkgId, Module}}, ::FileIO.Formatted; options::@Kwargs{}) @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:219 [6] action @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:196 [inlined] [7] action @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:185 [inlined] [8] load(::String; options::@Kwargs{}) @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:113 [9] load(::String) @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:109 [10] top-level scope @ REPL[2]:1 Stacktrace: [1] handle_error(e::MethodError, q::Base.PkgId, bt::Vector{Union{Ptr{Nothing}, Base.InterpreterIP}}) @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/error_handling.jl:61 [2] handle_exceptions(exceptions::Vector{Tuple{Any, Union{Base.PkgId, Module}, Vector}}, action::String) @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/error_handling.jl:56 [3] action(::Symbol, ::Vector{Union{Base.PkgId, Module}}, ::FileIO.Formatted; options::@Kwargs{}) @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:228 [4] action @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:196 [inlined] [5] action @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:185 [inlined] [6] load(::String; options::@Kwargs{}) @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:113 [7] load(::String) @ FileIO /data.lmp/lhupe/.julia/packages/FileIO/jMf68/src/loadsave.jl:109 [8] top-level scope @ REPL[2]:1 ```