Я ищу R эквивалент Python __reduce__
для сериализации и десериализации классов S3 - т.е. какой-то метод ручного указания, как сериализовать и десериализовать объекты, принадлежащие определенному классу .
Простой пример:
Создатель объекта:
make_obj <- function(a = 1) {
obj <- list(a = a, b = a + 1)
class(obj) <- "myClass"
return(obj)
}
Сериализатор и десериализатор:
serializer <- function(obj) return(as.character(obj$a))
deserializer <- function(s) {
a <- as.numeric(s)
return(make_obj(a))
}
Я вижу, что R имеет такие функции, как saveRDS
и readRDS
, которые принимают аргумент refhook
для настраиваемой сериализации и могут использоваться с этими двумя функциями по назначению:
myObj <- make_obj(10)
saveRDS(myObj, "myObj.Rds", refhook = serializer)
newObj <- readRDS("myObj.Rds", refhook = deserializer)
Но я ищу какой-нибудь способ сделать этот автомат c на основе класса объекта, чтобы (а) он работал с сеансом сохранения и восстановления RStudio, когда эти объекты находились в среде, и чтобы (б) кто-то мог просто загрузить пакет и затем использовать внутренние функции сериализации R без лишних хлопот.
Хотя я определил пользовательский saveRDS.myClass
и зарегистрировал его как метод S3 - например:
saveRDS.myClass <- function(obj, ...) {
s <- serializer(obj)
saveRDS(s, ...)
}
Но это не сработает с RStudio В сеансе, и при вызове readRDS
он не будет знать, что он должен использовать пользовательскую функцию десериализации после загрузки этого объекта.
Есть ли способ сделать эти функции сериализации и десериализации подключенными к классу S3, так сказать?