Windows11下Julia 1.8.5无法反序列化Windows10中Julia1.7.3生成的序列化文件
Julia跨版本反序列化报错解决办法
在Windows 10上用Julia 1.7.3序列化的文件,到Windows 11的Julia 1.8.5里反序列化时出现以下错误:
ERROR: ArgumentError: array must be non-empty Stacktrace: [1] pop! @ .\array.jl:1314 [inlined] [2] deserialize_cycle [6] handle_deserialize(s::Serializer{IOStream}, b::Int32) @ Serialization C:\Users\adjun\AppData\Local\Programs\Julia-1.8.5\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:919 [7] deserialize @ C:\Users\adjun\AppData\Local\Programs\Julia-1.8.5\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:813 [inlined] [8] deserialize(s::IOStream) @ Serialization C:\Users\adjun\AppData\Local\Programs\Julia-1.8.5\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:800 [9] open(f::typeof(deserialize), args::String; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}) @ Base .\io.jl:384 [10] open @ .\io.jl:381 [inlined] [11] deserialize(filename::String) @ Serialization C:\Users\adjun\AppData\Local\Programs\Julia-1.8.5\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:810 [12] top-level scope @ d:\OneDrive\catO\다섯\AD 고 2 참\ori_4.jl:1522
问题根源
Julia官方的Serialization模块仅针对同版本或极相近小版本的临时数据传输设计,1.7到1.8版本之间,循环引用的序列化逻辑有改动,导致旧版本生成的循环引用序列化文件在新版本解析时触发空数组错误。
解决方法
1. 改用跨版本兼容的第三方序列化库
放弃官方的serialize/deserialize,使用专门优化跨版本兼容性的库(比如JLD2或BSON):
- 安装JLD2:
using Pkg Pkg.add("JLD2") - 保存数据:
using JLD2 JLD2.save("your_data.jld2", :target_obj, your_object) - 加载数据(任意支持的Julia版本均可读取):
using JLD2 loaded_obj = JLD2.load("your_data.jld2", :target_obj)
2. 临时降级版本转存数据
如果必须使用原序列化文件,先在1.7.3版本中反序列化,再用兼容库转存:
- 用juliaup安装并切换到1.7.3:
juliaup add 1.7.3 juliaup use 1.7.3 - 运行代码转存:
using Serialization, JLD2 old_obj = deserialize("your_old_file.jls") JLD2.save("converted_data.jld2", :obj, old_obj) - 切回1.8.5版本,直接读取转存后的文件即可。
3. 手动处理循环引用(不推荐)
如果原对象存在循环引用,可在1.7.3序列化前手动解除循环引用,加载后再重新构建,但该方法需要对对象结构非常熟悉,操作繁琐,一般不建议采用。
内容的提问来源于stack exchange,提问作者andyname
相关产品推荐
相关产品推荐

