本文简要介绍ruby语言中 Marshal模块
的用法。
编组库将 Ruby 对象的集合转换为字节流,允许将它们存储在当前活动脚本之外。随后可以读取该数据并重构原始对象。
封送数据具有与对象信息一起存储的主要和次要版本号。在正常使用中,marshaling 只能加载使用相同的主要版本号和相等或更低的次要版本号写入的数据。如果设置了 Ruby 的 “verbose” 标志(通常使用 -d、-v、-w 或 -verbose),则主次编号必须完全匹配。 Marshal
版本控制与 Ruby 的版本号无关。您可以通过读取封送数据的前两个字节来提取版本。
str = Marshal.dump("thing")
RUBY_VERSION #=> "1.9.0"
str[0].ord #=> 4
str[1].ord #=> 8
某些对象无法转储:如果要转储的对象包括绑定、过程或方法对象、类的实例 IO
或单例对象,则会引发 TypeError
。
如果您的类有特殊的序列化需求(例如,如果您想以某种特定格式进行序列化),或者如果它包含无法序列化的对象,您可以实现自己的序列化策略。
有两种方法可以做到这一点,您的对象可以定义marshal_dump 和marshal_load 或_dump 和_load。 marshal_dump 将优先于 _dump 如果两者都被定义。 marshal_dump 可能会导致较小的 Marshal
字符串。
安全注意事项
按照设计, Marshal.load
可以反序列化几乎任何加载到 Ruby 进程中的类。在许多情况下,如果 Marshal
数据是从不受信任的源加载的,这可能会导致远程代码执行。
因此, Marshal.load
不适合作为通用序列化格式,您永远不应解组用户提供的输入或其他不受信任的数据。
如果您需要反序列化不受信任的数据,请使用 JSON
或其他只能加载简单 ‘primitive’ 类型的序列化格式,例如 String
、 Array
、 Hash
等。切勿允许用户输入指定要反序列化的任意类型。
marshal_dump 和 marshal_load
转储对象时,将调用方法marshal_dump。 marshal_dump 必须返回包含marshal_load 重构对象所需信息的结果。结果可以是任何对象。
加载使用marshal_dump 转储的对象时,首先分配对象,然后调用marshal_load 并使用marshal_dump 的结果。 marshal_load 必须根据结果中的信息重新创建对象。
例子:
class MyObj
def initialize name, version, data
@name = name
@version = version
@data = data
end
def marshal_dump
[@name, @version]
end
def marshal_load array
@name, @version = array
end
end
_dump 和 _load
当您需要分配要自己恢复的对象时,请使用 _dump 和 _load。
转储对象时,实例方法 _dump 使用 Integer
调用,该 Integer
指示要转储的对象的最大深度(值 -1 表示您应该禁用深度检查)。 _dump 必须返回一个 String
,其中包含重构对象所需的信息。
类方法 _load 应该采用 String
并使用它返回同一类的对象。
例子:
class MyObj
def initialize name, version, data
@name = name
@version = version
@data = data
end
def _dump level
[@name, @version].join ':'
end
def self._load args
new(*args.split(':'))
end
end
由于 Marshal.dump
输出一个字符串,您可以让 _dump 返回一个 Marshal
字符串,它是复杂对象的 _load 中的 Marshal.loaded。
相关用法
- Ruby Marshal.dump用法及代码示例
- Ruby Marshal.load用法及代码示例
- Ruby Markdown类用法及代码示例
- Ruby Markup类用法及代码示例
- Ruby Markup.add_regexp_handling用法及代码示例
- Ruby MatchData.pre_match用法及代码示例
- Ruby Matrix lup()用法及代码示例
- Ruby Matrix unitary?()用法及代码示例
- Ruby Matrix symmetric?()用法及代码示例
- Ruby Matrix t()用法及代码示例
- Ruby Matrix identity()用法及代码示例
- Ruby Matrix hash()用法及代码示例
- Ruby Matrix hadamard_product()用法及代码示例
- Ruby Matrix singular?()用法及代码示例
- Ruby Math sqrt()用法及代码示例
- Ruby Matrix round()用法及代码示例
- Ruby Matrix collect()用法及代码示例
- Ruby Math.acosh用法及代码示例
- Ruby Matrix hermitian?()用法及代码示例
- Ruby Matrix row_vectors()用法及代码示例
- Ruby Matrix conjugate()用法及代码示例
- Ruby Math.asinh用法及代码示例
- Ruby Matrix cofactor()用法及代码示例
- Ruby Matrix rectangular()用法及代码示例
- Ruby Matrix component()用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Marshal模块。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。