【问题标题】:How to serialize an array and deserialize back如何序列化数组并反序列化
【发布时间】:2013-03-17 11:49:16
【问题描述】:

如何序列化数组并从字符串反序列化返回?我尝试了以下代码,但它并没有真正返回原始整数数组,而是返回字符串数组。

 x = [1,2,3].join(',') # maybe this is not the correct way to serialize to string?
 => '1,2,3'

 x = x.split(',')
 => [ '1', '2', '3' ]

有没有办法在没有.collect{ |x| x.to_i } 的情况下将其恢复为整数?

【问题讨论】:

    标签: ruby serialization deserialization


    【解决方案1】:

    标准方式是Marshal:

    x = Marshal.dump([1, 2, 3])
    #=> "\x04\b[\bi\x06i\ai\b"
    
    Marshal.load(x)
    #=> [1, 2, 3]
    

    但你也可以使用JSON

    require 'json'
    
    x = [1, 2, 3].to_json
    #=> "[1,2,3]"
    
    JSON::parse(x)
    #=> [1, 2, 3]
    

    YAML:

    require 'yaml'
    
    x = [1, 2, 3].to_yaml
    #=> "---\n- 1\n- 2\n- 3\n"
    
    YAML.load(x)
    #=> [1, 2, 3]
    

    【讨论】:

      【解决方案2】:

      Split 只是一个用于切分字符串的工具 - 它不知道该字符串是从哪里来的。

      序列化数据的方式有很多种:YAML、JSON 和 Marshal 是 Ruby 标准库中的三种。都区分字符串、整数等。

      各有利弊。例如,从不受信任的来源加载 Marshal 数据是危险的,如果您需要与非 Ruby 代码交换数据,Marshal 就不好。 JSON 通常是一个很好的多面手。

      【讨论】:

      • 加载编组数据有什么危险?您是否正在考虑eval? Marshal 是确保原始编码的唯一方法。
      • 引用 marshal 的 ruby​​ 文档 “按照设计,::load 可以反序列化几乎任何加载到 Ruby 进程中的类。在许多情况下,如果从以下位置加载 Marshal 数据,这可能会导致远程代码执行一个不受信任的来源。”
      • 我想知道您是否可以举一个具体的例子,但在 OP 的情况下可能会发生这种情况。我认为这不可能。
      • 如果你控制了源数据,你就可以了。如果不是...tenderlovemaking.com/2013/02/06/yaml-f7u12.html 是关于 YAML 但同样适用于元帅
      猜你喜欢
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      相关资源
      最近更新 更多