在R中反序列化字符串

时间:2016-10-18 12:26:31

标签: r

假设我有这个对象a

a <- list(x = 1, y = 2)

我使用以下代码将其序列化并转换为字符串:

s <- serialize(a, NULL)
s2 <- paste0(s, collapse = "")

所以现在我只有s2,我需要再次获得a。我这样做,但是我收到了一个错误:

s3 <- substring(s2, seq(1,nchar(s2),2), seq(2,nchar(s2),2))
s4 <- as.raw(s3)
Warning messages:
1: NAs introduced by coercion 
2: out-of-range values treated as 0 in coercion to raw 
unserialize(s4)
Error in unserialize(s4) : unknown input format

我也试过

> charToRaw(s2) %>% unserialize()
Error in unserialize(.) : unknown input format

我真的需要s2成为单元素字符向量。 我如何获得a

2 个答案:

答案 0 :(得分:2)

as.raw对字符不起作用,您需要先将十六进制数字转换为数字:

s4 = as.raw(as.integer(paste0('0x', s3)))
unserialize(s4)

答案 1 :(得分:0)

这是一个使用@Konrad很好的答案中的技术的dplyr可重现示例

以一些字符串/字符开头

library(dplyr)
some_string <- 'something 123 something'

序列化

(serialized_char <- some_string %>% serialize(NULL) %>% as.character() %>% paste0(collapse = ""))
[1] "580a000000030003060200030500000000055554462d3800000010000000010004000900000017736f6d657468696e672031323320736f6d657468696e67"

反序列化回字符串/字符

(unserialized <- serialized_char %>% 
    {substring(., seq(1, nchar(.), 2), seq(2, nchar(.), 2))} %>% 
    paste0("0x", .) %>% 
    as.integer %>% 
    as.raw %>% 
    unserialize())
[1] "something 123 something"

并确保绝对有效

some_string == unserialized
[1] TRUE