-
Notifications
You must be signed in to change notification settings - Fork 39
Description
#91 fixed an issue related to resolving the names of custom types. However, this only seems to work when the custom types are defined within separate packages, as in the case of the example in the README file.
Consider the following script that generates data.bson
using BSON
include("BModule.jl")
using .BModule
x = BStruct(1)
bson("data.bson", Dict(:x=>x))
with BModule.jl being
module BModule
export BStruct
struct BStruct
b
end
end
If I start a new Julia session and want to read data.bson from a module (without running the code above), e.g., I only run the following in REPL
module CModule
using BSON
include("BModule.jl")
using .BModule
x = BSON.load("data.bson", @__MODULE__)
end
I get an error message that BModule is not defined
ERROR: UndefVarError: BModule not defined
Stacktrace:
[1] #31
@ ~/.julia/packages/BSON/73cTU/src/extensions.jl:21 [inlined]
[2] (::Base.BottomRF{BSON.var"#31#32"})(acc::Module, x::String)
@ Base ./reduce.jl:81
[3] _foldl_impl(op::Base.BottomRF{BSON.var"#31#32"}, init::Module, itr::Vector{Any})
@ Base ./reduce.jl:62
[4] foldl_impl
@ ./reduce.jl:48 [inlined]
[5] mapfoldl_impl
@ ./reduce.jl:44 [inlined]
[6] _mapreduce_dim
@ ./reducedim.jl:362 [inlined]
[7] #mapreduce#765
@ ./reducedim.jl:357 [inlined]
[8] #reduce#767
@ ./reducedim.jl:406 [inlined]
[9] resolve(fs::Vector{Any}, init::Module)
@ BSON ~/.julia/packages/BSON/73cTU/src/extensions.jl:21
[10] (::BSON.var"#35#36")(d::Dict{Symbol, Any}, init::Module)
@ BSON ~/.julia/packages/BSON/73cTU/src/extensions.jl:64
[11] _raise_recursive(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
@ BSON ~/.julia/packages/BSON/73cTU/src/read.jl:80
[12] raise_recursive(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
@ BSON ~/.julia/packages/BSON/73cTU/src/read.jl:93
[13] (::BSON.var"#49#50")(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
@ BSON ~/.julia/packages/BSON/73cTU/src/extensions.jl:167
[14] raise_recursive(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
@ BSON ~/.julia/packages/BSON/73cTU/src/read.jl:92
[15] (::BSON.var"#19#22"{IdDict{Any, Any}, Module})(x::Dict{Symbol, Any})
@ BSON ~/.julia/packages/BSON/73cTU/src/read.jl:86
[16] applychildren!(f::BSON.var"#19#22"{IdDict{Any, Any}, Module}, x::Dict{Symbol, Any})
@ BSON ~/.julia/packages/BSON/73cTU/src/BSON.jl:19
[17] _raise_recursive(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
@ BSON ~/.julia/packages/BSON/73cTU/src/read.jl:86
[18] raise_recursive(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
@ BSON ~/.julia/packages/BSON/73cTU/src/read.jl:93
[19] raise_recursive
@ ~/.julia/packages/BSON/73cTU/src/read.jl:103 [inlined]
[20] load(x::String, init::Module)
@ BSON ~/.julia/packages/BSON/73cTU/src/read.jl:108
[21] top-level scope
@ REPL[1]:7
The issue seems to be related to the fact that Main is part of the name of the custom type (Main.BModule.BStruct in this case) for locally defined custom types, but it is not part of the names of types defined within packages. #91 does not seem to take that into account.
For my example above, I found two potential workarounds: 1. load BModule in Main from where I have generated data.bson, or 2. redefine resolve() to make sure that the function is looking in the correct namespace, e.g.,
module CModule
using BSON
include("BModule.jl")
using .BModule
function BSON.resolve(fs, init)
if first(fs) == "Main"
fs = fs[2:end]
end
reduce((m, f) -> getfield(m, Symbol(f)), fs; init = init)
end
x = BSON.load("data.bson", @__MODULE__)
end
Solution 1 does not really fix the problem and can become cumbersome if the BSON file was also generated within a module and not in Main. Solution 2 is a bit of a hack, but I hope it provides a starting point for people more knowledgeable than me.