R: как определить сериализаторы класса? - PullRequest
1 голос
/ 02 мая 2020

Я ищу 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, так сказать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...