JuliaIO / BSON.jl

Other
158 stars 39 forks source link

Loading old data that contains anonymous methods fails with BSON.jl v0.3.3 #95

Open takasho777 opened 3 years ago

takasho777 commented 3 years ago

With #94, I can save and load data that have anonymous methods in Julia 1.6. However, when I load such a BSON file that's saved with the previous version of Julia and BSON.jl, then BSON.load method fails. Is there a workaround to this compatibility issue? Below is an example borrowed from #80.

With Julia 1.5.4 and BSON.jl v0.3.2

using BSON
f = x -> 2x
BSON.@save "test.bson" f

Then, with Julia 1.6.0 and BSON.jl v0.3.3

using BSON
BSON.load("test.bson")

which returns the following error.

ERROR: MethodError: Cannot `convert` an object of type Module to an object of type Symbol
Closest candidates are:
  convert(::Type{T}, ::T) where T at essentials.jl:205
  Symbol(::Any...) at strings/basic.jl:229
Stacktrace:
  [1] newstruct!(::Method, ::Module, ::Symbol, ::Symbol, ::Int32, ::Type, ::String, ::Nothing, ::Int32, ::Bool, ::Int32, ::Core.CodeInfo)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/extensions.jl:99
  [2] newstruct_raw(cache::IdDict{Any, Any}, T::Type, d::Dict{Symbol, Any}, init::Module)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/extensions.jl:126
  [3] (::BSON.var"#45#46")(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/extensions.jl:141
  [4] raise_recursive(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/read.jl:92
  [5] (::BSON.var"#23#24"{IdDict{Any, Any}, Module})(x::Dict{Symbol, Any})
    @ BSON ~/.julia/packages/BSON/aEqHo/src/read.jl:98
  [6] applychildren!(f::BSON.var"#23#24"{IdDict{Any, Any}, Module}, x::Vector{Any})
    @ BSON ~/.julia/packages/BSON/aEqHo/src/BSON.jl:28
  [7] raise_recursive
    @ ~/.julia/packages/BSON/aEqHo/src/read.jl:98 [inlined]
  [8] (::BSON.var"#23#24"{IdDict{Any, Any}, Module})(x::Vector{Any})
    @ BSON ~/.julia/packages/BSON/aEqHo/src/read.jl:98
  [9] applychildren!(f::BSON.var"#23#24"{IdDict{Any, Any}, Module}, x::Vector{Any})
    @ BSON ~/.julia/packages/BSON/aEqHo/src/BSON.jl:28
 [10] raise_recursive(v::Vector{Any}, cache::IdDict{Any, Any}, init::Module)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/read.jl:98
 [11] newstruct_raw(cache::IdDict{Any, Any}, #unused#::Type{Core.TypeName}, d::Dict{Symbol, Any}, init::Module)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/anonymous.jl:95
 [12] (::BSON.var"#45#46")(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/extensions.jl:141
 [13] raise_recursive(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/read.jl:92
 [14] (::BSON.var"#18#21"{IdDict{Any, Any}, Module})(x::Dict{Symbol, Any})
    @ BSON ~/.julia/packages/BSON/aEqHo/src/read.jl:82
 [15] applychildren!(f::BSON.var"#18#21"{IdDict{Any, Any}, Module}, x::Dict{Symbol, Any})
    @ BSON ~/.julia/packages/BSON/aEqHo/src/BSON.jl:21
 [16] _raise_recursive(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/read.jl:82
 [17] raise_recursive(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/read.jl:93
 [18] (::BSON.var"#45#46")(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/extensions.jl:139
 [19] raise_recursive(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/read.jl:92
 [20] (::BSON.var"#19#22"{IdDict{Any, Any}, Module})(x::Dict{Symbol, Any})
    @ BSON ~/.julia/packages/BSON/aEqHo/src/read.jl:86
 [21] applychildren!(f::BSON.var"#19#22"{IdDict{Any, Any}, Module}, x::Dict{Symbol, Any})
    @ BSON ~/.julia/packages/BSON/aEqHo/src/BSON.jl:21
 [22] _raise_recursive(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/read.jl:86
 [23] raise_recursive(d::Dict{Symbol, Any}, cache::IdDict{Any, Any}, init::Module)
    @ BSON ~/.julia/packages/BSON/aEqHo/src/read.jl:93
 [24] raise_recursive
    @ ~/.julia/packages/BSON/aEqHo/src/read.jl:103 [inlined]
 [25] load (repeats 2 times)
    @ ~/.julia/packages/BSON/aEqHo/src/read.jl:108 [inlined]
 [26] top-level scope
    @ REPL[3]:1
bienpierre commented 2 years ago

Hello, I have the same issue. Have you found a workaround? Regards

darsnack commented 2 years ago

You can use #102 as a quick workaround. The reason we haven't merged yet is because the fix involves updating some fragile code calling into Julia's C internals. So, we are doing a longer term fix that removes that fragile implementation entirely. But #102 will work in a pinch.

darsnack commented 2 years ago

I am closing this as a duplicate of #107.