从内存中的 ASCII 而不是从文件连接反序列化对象

2024-01-07

实际问题

如何将对象序列化为 ASCII 并再次从 ASCII 反序列化without必须对文件连接进行写入和读取(即从内存中的 ASCII)?

背景

在无状态的客户端-服务器框架中,我想使某些信息在调用中持久化(序列化 >> 发送到客户端 >> 从客户端返回序列化信息 >> 反序列化)而不将其缓存在服务器端。

请注意,我的 JSON 对象/strong 还包含其他未序列化的信息,因此与序列化信息混合,这就是为什么该方法在这个帖子 https://stackoverflow.com/questions/2258511/r-serialize-objects-to-text-file-and-back-again并不能完全解决问题。

现在,问题是我想反序列化仅基于已读取的 JSON 字符串的对象。可以这么说:来自“内存中 ASCII”而不是来自文件连接。我该怎么做呢?

这是我尝试过的:

require(forecast)

方法一

## SERVER: estimates initial model and writes JSON to socket
model <- auto.arima(AirPassengers, trace = TRUE)

## Model trace:
# ARIMA(2,1,2)(1,1,1)[12]                    : Inf
# ARIMA(0,1,0)(0,1,0)[12]                    : 967.6773
# ARIMA(1,1,0)(1,1,0)[12]                    : 965.4487
# ARIMA(0,1,1)(0,1,1)[12]                    : 957.1797
# ARIMA(0,1,1)(1,1,1)[12]                    : 963.5291
# ARIMA(0,1,1)(0,1,0)[12]                    : 956.7848
# ARIMA(1,1,1)(0,1,0)[12]                    : 959.4575
# ARIMA(0,1,2)(0,1,0)[12]                    : 958.8701
# ARIMA(1,1,2)(0,1,0)[12]                    : 961.3943
# ARIMA(0,1,1)(0,1,0)[12]                    : 956.7848
# ARIMA(0,1,1)(1,1,0)[12]                    : 964.7139
# 
# Best model: ARIMA(0,1,1)(0,1,0)[12]  

fc <- as.data.frame(forecast(model))
deparsed <- deparse(model)

json_out <- list(data = AirPassengers, model = deparsed, fc = fc)
json_out <- jsonlite::toJSON(json_out)

## CLIENT: keeps estimated model, updates data, writes to socket
json_in <- jsonlite::fromJSON(json_out)
json_in$data <- window(AirPassengers, end = 1949 + (1/12 * 14))

## SERVER: reads new JSON and applies model to new data
data <- json_in$data
model_0 <- json_in$model
model_1 <- eval(parse(text = model_0))

## Model trace:
# ARIMA(2,1,2)(1,1,1)[12]                    : Inf
# ARIMA(0,1,0)(0,1,0)[12]                    : 967.6773
# ARIMA(1,1,0)(1,1,0)[12]                    : 965.4487
# ARIMA(0,1,1)(0,1,1)[12]                    : 957.1797
# ARIMA(0,1,1)(1,1,1)[12]                    : 963.5291
# ARIMA(0,1,1)(0,1,0)[12]                    : 956.7848
# ARIMA(1,1,1)(0,1,0)[12]                    : 959.4575
# ARIMA(0,1,2)(0,1,0)[12]                    : 958.8701
# ARIMA(1,1,2)(0,1,0)[12]                    : 961.3943
# ARIMA(0,1,1)(0,1,0)[12]                    : 956.7848
# ARIMA(0,1,1)(1,1,0)[12]                    : 964.7139
# 
# Best model: ARIMA(0,1,1)(0,1,0)[12]  

# Warning message:
#   In auto.arima(x = structure(list(x = structure(c(112, 118, 132,  :
#       Unable to fit final model using maximum likelihood. AIC value approximated

fc <- as.data.frame(forecast(Arima(data, model = model_1)))

## And so on ...

这可行,但请注意eval(parse(text = json_in$model))实际上re-runs打电话给auto.arima()而不是仅仅重新建立/反序列化对象(请注意打印到控制台的跟踪信息,我将其作为注释包含在内)。

这并不完全是我想要的,因为只是想以最快的方式重新建立最终的模型对象。

这就是为什么我转向serialize() next.

方法2

## SERVER: estimates initial model and writes JSON to socket
model <- auto.arima(AirPassengers, trace = TRUE)
fc <- as.data.frame(forecast(model))
serialized <- serialize(model, NULL)
class(serialized)

json_out <- list(data = AirPassengers, model = serialized, fc = fc)
json_out <- jsonlite::toJSON(json_out)

## CLIENT: keeps estimated model, updates data, writes to socket
json_in <- jsonlite::fromJSON(json_out)
json_in$data <- window(AirPassengers, end = 1949 + (1/12 * 14))

## SERVER: reads new JSON and applies model to new data
data <- json_in$data
model_0 <- json_in$model
try(model_1 <- unserialize(model_0))
## --> error:
# Error in unserialize(model_0) : 
#   character vectors are no longer accepted by unserialize()

不幸的是,功能unserialize()需要文件连接而不是“纯 ASCII”。

这就是为什么我需要执行以下解决方法。

方法3

## SERVER: estimates initial model and writes JSON to socket
model <- auto.arima(AirPassengers, trace = TRUE)
fc <- as.data.frame(forecast(model))
con <- file("serialized", "w+")
serialize(model, con)
close(con)

json_out <- list(data = AirPassengers, model = "serialized", fc = fc)
json_out <- jsonlite::toJSON(json_out)

## CLIENT: keeps estimated model, updates data, writes to socket
json_in <- jsonlite::fromJSON(json_out)
json_in$data <- window(AirPassengers, end = 1949 + (1/12 * 14))

## SERVER: reads new JSON and applies model to new data
data <- json_in$data
model_0 <- json_in$model
con <- file(model_0, "r+")
model_1 <- unserialize(con)
close(con)
fc <- as.data.frame(forecast(Arima(data, model = model_1)))

## And so on ...

现在反序列化工作无需实际auto.arima()正在重新评估呼叫。但这违背了我的无状态范例,因为现在实际信息缓存在服务器端,而不是通过 JSON 对象/字符串实际发送。


这符合您的需求吗?

它遵循您的总体策略方法2。唯一的区别是它使用as.character()在将序列化对象传递给之前将其转换为字符向量toJSON(),然后使用as.raw(as.hexmode())将其转换回“另一侧”的原始向量。 (我已经用注释标记了两行已编辑的行## <<- Edited.)

library(forecast)

## SERVER: estimates initial model and writes JSON to socket
model <- auto.arima(AirPassengers, trace = TRUE)
fc <- as.data.frame(forecast(model))
serialized <- as.character(serialize(model, NULL)) ## <<- Edited
class(serialized)


json_out <- list(data = AirPassengers, model = serialized, fc = fc)
json_out <- jsonlite::toJSON(json_out)

## CLIENT: keeps estimated model, updates data, writes to socket
json_in <- jsonlite::fromJSON(json_out)
json_in$data <- window(AirPassengers, end = 1949 + (1/12 * 14))

## SERVER: reads new JSON and applies model to new data
data <- json_in$data
model_0 <- as.raw(as.hexmode(json_in$model))       ## <<- Edited

unserialize(model_0)
## Series: AirPassengers 
## ARIMA(0,1,1)(0,1,0)[12]                    
## 
## Coefficients:
##           ma1
##       -0.3184
## s.e.   0.0877
## 
## sigma^2 estimated as 137.3:  log likelihood=-508.32
## AIC=1020.64   AICc=1020.73   BIC=1026.39
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从内存中的 ASCII 而不是从文件连接反序列化对象 的相关文章

随机推荐

  • 为 Django Oscar 存储信用/虚拟货币应用程序?

    我希望为存储虚拟货币的客户建立一个商店信用模型 此商店信用应用程序将存储可用于支付产品费用的积分 在退货或某些方案中添加 是django oscar 账户 https github com django oscar django oscar
  • Delphi7 WCF方法输入参数

    我有 wcf web 服务 basicHttpBinding 我们的Delphi7客户端无法正确使用它 我已经使用 WCF 附加功能简化了 WSDL 好的 Delphi7 wsdl 导入器生成代理正确 现在我遇到了输入参数的问题 它们总是有
  • HTTP 404 与 Ajax.ActionLink

    我无法解决 404 错误 Global asax cs 中的默认路由 routes MapRoute Default controller action id new controller Home action Index id UrlP
  • SQL 或 LINQ:如何选择仅一个参数发生变化的记录?

    假设我们有这个列表 Id IdRef myColumn anotherColumn 448 70 1 228 449 70 1 2s8 451 70 1 228 455 70 2 2a8 456 70 2 s28 457 70 2 28 4
  • 匹配嵌套大括号的正则表达式

    我需要正则表达式来匹配正确的大括号 例如每个开一闭一abc abc bc xyz 我需要它 从中获取一切 abc bc xyz 没有得到 abc bc 我尝试使用 这对于正则表达式来说是不可能的 为此需要上下文无关语法 并且正则表达式仅适用
  • 检测图像是否像素化的最佳方法是什么?

    我试图判断图像是否像素化 我试图使用拉普拉斯方差方法来执行此操作 但我不确定它是否正常工作 因为使用我的代码返回的图像非常扭曲 像素化 方差非常高 为 1011 import sys import cv2 import imutils as
  • 比较列表中除您自己之外的项目

    我想比较列表中的项目 但不希望将其与其自身进行比较 我怎么做 我的代码 var students new List
  • 缺少对 verify(mock) 的方法调用,但有一个吗?

    介绍 我正在尝试进行一个测试来验证 使用 Mockito v1 9 5 的verify 一个带有签名的方法deinit 在界面中Bar在执行传递后调用Foo deinit 我遇到了一个我真的不明白的错误 这是FooTest java我正在尝
  • 在分支中应用补丁

    我收到了来自贡献者的补丁 显然 他在后备箱中制作了补丁 但是 我想将他的更改提交到一个新分支 我可以知道如何通过 Tortoise Hg 做到这一点吗 下面的说明假设您希望将补丁隔离在named branch 使用命令行 可以轻松地将补丁应
  • JAX-RS访问控制

    有人可以为我提供一些有关 JAX R Web 服务中的访问控制的指示吗 例如根据用户凭据 名称或任何其他标准限制访问 在sun手册中找不到任何有用的信息 提前致谢 阿迪尔 我个人使用 Spring security 来完成此任务 Sprin
  • 覆盖 Python cmd 模块中未记录的帮助区域

    我正在使用 Python 的 cmd 模块构建一个小型 CLI 工具 我不喜欢显示列出的未记录的命令 因此 当我输入 帮助 时 我只想显示记录的命令 当前输入帮助显示 Documented commands type help
  • 使用 LINQ 过滤集合

    假设我们有一个 Person 对象的集合 class Person public string PersonName get set public string PersonAddress get set 以及代码定义集合中的某处 List
  • 从命令行使用 git 属性

    我的仓库中有这样的配置 echo java diff java gt gt gitattributes 当我这样做时git diff 我得到了预期的结果 不过 我正在编写一个脚本来分析其他 git 存储库 所以我通常会这样做 git git
  • Vaadin 会话管理 - 它是如何工作的?

    在工作中 我们使用 Vaadin 开发一个 Web 应用程序 我是一位相当高级的 Java 程序员 我对 Vaadin 也有经验 但现在我已经到了需要将信息存储在用户会话中的地步 区域设置 用户名等属性 In the Vaadin 文档 h
  • Django Auth LDAP - 使用 sAMAccountName 直接绑定

    有两种方法可以使用 Django Auth LDAP 对用户进行身份验证 搜索 绑定和 直接绑定 第一个涉及匿名或使用固定帐户连接到 LDAP 服务器并搜索身份验证用户的可分辨名称 然后我们可以尝试再次使用用户的密码进行绑定 第二种方法是从
  • 自动判断用户定义函数是否与隐式函数等价

    有时 用户实现的函数具有与其隐式定义版本相同的功能 例如 复制构造函数只调用其所有成员的复制构造函数 struct A int B A const A a B a B 这是不希望的 因为它会导致额外的维护 例如 如果类成员被重命名 重新排序
  • $.clone 和 .cloneNode

    我对 jQuery 之间的区别有点困惑 clone和原始的 cloneNode财产 如果我在做 blah cloneNode true 这将在 jQuery 空间之外创建一个全局对象 If I use blah clone true 这将在
  • 允许 foreach 工作人员注册并将子任务分配给其他工作人员

    我有一个 R 代码 其中涉及多个 foreach 工作人员来并行执行一些任务 我正在使用 foreach 和 doMC 来实现此目的 我想让每个 foreach 工作人员招募一些新工作人员 并将其代码的某些部分 可并行 分发给他们 当前的代
  • 增强 now.js/socket.io 聊天的安全性

    与聊天nowjs http nowjs org or 套接字 io http socket io 是您可以用它们进行的最简单的练习之一 我想使用 nowjs 的 Group 对象实现多房间聊天 具有非固定数量的房间和登录用户 我还没有直接使
  • 从内存中的 ASCII 而不是从文件连接反序列化对象

    实际问题 如何将对象序列化为 ASCII 并再次从 ASCII 反序列化without必须对文件连接进行写入和读取 即从内存中的 ASCII 背景 在无状态的客户端 服务器框架中 我想使某些信息在调用中持久化 序列化 gt gt 发送到客户