登录
首页 >  Golang >  Go教程

Ruby序列化和持久化存储(Marshal、Pstore)操作方法详解

来源:脚本之家

时间:2023-01-21 12:41:04 472浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《Ruby序列化和持久化存储(Marshal、Pstore)操作方法详解》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

Ruby Marshal序列化

Marshal是Ruby的核心库,可以将一些对象以二进制的方式序列化保存到文件中,需要时再从文件中加载重新构建成对象,即反序列化。

Marshal对数值、字符串、数组、布尔值等基础数据的序列化保存没有任何问题。

但并非所有类型的数据都能序列化。Marshal从序列化文件中加载并重新构建成对象的过程中会执行一些操作,但还原的过程有些内容可能会丢失它不能序列化I0流对象以及代码类对象: Proc对象、 单例对象、匿名类和模块,这是它的限制所在。

序列化和反序列化的过程非常简单:

# 一个嵌套数组
arr = [
  %w(Perl Python PHP),
  %w(C C++ Java Golang),
  %w(Shell Powershell Cmdline)
  ]

# 将arr对象序列化保存到文件中
File.open('/tmp/data.dat', "w") do |file|
  Marshal.dump(arr, file)
end

# 反序列化
File.open('/tmp/data.dat') do |file|
  data = Marshal.load(file)
end

p data

Marshal.dump()还可以通过第三个参数指定最多允许序列化多少个嵌套的对象层次,即深度,超出了深度将报错。其默认值为-1,此时表示不检查深度,即dump所有层次。例如:

arr = [
  %w(Perl Python PHP),
  [ %w(C C++), %(Java Golang) ],   #=> 3层
  %w(Shell Powershell Cmdline)
  ]

# 将arr对象序列化保存到文件中
File.open('/tmp/data.dat', "w") do |file|
  Marshal.dump(arr, file, 4)      #=> 小于4将报错
end

如果想要指定对象中要序列化的内容,或者指定序列化成什么类型,可以在类中编写marshal_dumpmarshal_load方法。例如,只dump一部分数据并以数组的方式保存:

class Klass
  def initialize name, age, height 
    @name = name
    @age = age
    @height = height
  end
  
  def marshal_dump
    [@name, @age]
  end
  
  # 反序列化,arr是序列化时的数组
  # 最终它返回一个Klass的实例对象
  def marshal_load arr
    @name, @age = arr
  end
end

# 序列化Klass的一个对象,但只会包含name和age两个属性
obj = Klass.new("junmajinlong", 23, 170)
File.open('/tmp/me.dat','w') do |file|
  Marshal.dump(obj, file)
end

# 反序列化,得到一个Klass的实例对象,并设置name和age属性
obj1 = File.open("/tmp/me.dat") do |file|
  Marshal.load file
end

p obj1
#=> #<0x00007fffcc0119f8>

声明:本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表