blob: 6d54b62d9c8eeed82a5a2afb94d001c8fd223aad [file] [log] [blame]
# File src/library/base/R/serialize.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2018 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
saveRDS <-
function(object, file = "", ascii = FALSE, version = NULL,
compress = TRUE, refhook = NULL)
{
if(is.character(file)) {
if(file == "") stop("'file' must be non-empty string")
object <- object # do not create corrupt file if object does not exist
mode <- if(ascii %in% FALSE) "wb" else "w"
con <- if (is.logical(compress))
if(compress) gzfile(file, mode) else file(file, mode)
else
switch(compress,
"bzip2" = bzfile(file, mode),
"xz" = xzfile(file, mode),
"gzip" = gzfile(file, mode),
stop("invalid 'compress' argument: ", compress))
on.exit(close(con))
}
else if(inherits(file, "connection")) {
if (!missing(compress))
warning("'compress' is ignored unless 'file' is a file name")
con <- file
}
else
stop("bad 'file' argument")
.Internal(serializeToConn(object, con, ascii, version, refhook))
}
readRDS <- function(file, refhook = NULL)
{
if(is.character(file)) {
con <- gzfile(file, "rb")
on.exit(close(con))
} else if (inherits(file, "connection"))
con <- if(inherits(file, "url")) gzcon(file) else file
else stop("bad 'file' argument")
.Internal(unserializeFromConn(con, refhook))
}
serialize <-
function(object, connection, ascii = FALSE, xdr = TRUE,
version = NULL, refhook = NULL)
{
if (!is.null(connection)) {
if (!inherits(connection, "connection"))
stop("'connection' must be a connection")
if (missing(ascii)) ascii <- summary(connection)$text == "text"
}
if (!ascii && inherits(connection, "sockconn"))
.Internal(serializeb(object, connection, xdr, version, refhook))
else {
type <- if(is.na(ascii)) 2L else if(ascii) 1L else if(!xdr) 3L else 0L
.Internal(serialize(object, connection, type, version, refhook))
}
}
unserialize <- function(connection, refhook = NULL)
{
if (typeof(connection) != "raw" &&
!is.character(connection) &&
!inherits(connection, "connection"))
stop("'connection' must be a connection")
.Internal(unserialize(connection, refhook))
}