啊,我自己发现的。错误“no restore method available”表示您忘记为
unserialize
功能。你们两个都需要,一个回扣
serialize
和
序列化
.
反钩
串行化
在要返回的字符串中是完全自由的。唯一需要了解结果的是
序列化
.
示例:序列化和还原包含集中存储的环境的列表
生成环境存储库。让我们假装这些来自
外部源及其内容不需要序列化。恢复
它们,外部数据源只需要重新读取。
repo <- list()
for(i in 1:10){
repo[[i]] <- new.env()
repo[[i]]$a <- rnorm(1e6)
}
一个环境是8 MB大。我们不希望在序列化输出中包含所有这些数据,因为它已永久保存在
repo
.
object.size(repo[[1]]$a)
这是我们要序列化的列表。它包含第二个环境
从存储库中。我们只想存储数值
b
. 对于
环境,我们只想存储环境2
储存库。我们不想序列化内容,因为存储库
已经有了。
l <- list(a = repo[[2]], b = 42)
这是用于序列化的refhook。它在索引中查找环境
只存储索引。
ser <- function(e){
for(i in seq_along(repo)){
if(identical(e, repo[[i]])){
message("Identified environment #",i)
return(as.character(i)) # Just save the
}
}
message("Environment not found in the repository")
return(NULL)
}
非序列化的对应refhook获取索引并加载
相应的环境来自
回购协议
:
unser <- function(s){
i <- as.numeric(s)
return(repo[[i]])
}
这样可以节省序列化输出中的大量空间
-
不带自定义refhook:还包含环境
object.size(serialize(l, con = NULL))
## 8000040 bytes
-
使用自定义refhook:仅
l$b
并保存环境索引
s <- serialize(l, con = NULL, refhook = ser)
object.size(s)
## 168 bytes
当取消序列化时,将从数据库加载环境。
u <- unserialize(s, refhook = unser)
## $a
## <environment: 0x000000001c91a118>
##
## $b
## [1] 42