序列化/反序列化任意Ruby对象数据库



我有一个用例,在数据库表的一列中存储任意对象(类a或类b或类c)。然后当我读它的时候,我想把它反序列化回原来的类(A或B或C)有可能吗?

似乎我可以序列化对象json,并反序列化到OpenStruct对象。但我希望得到原始对象,所以我可以发送它作为一个响应,可以被我的protobuf定义识别。

[编辑]:

一个额外的要求是我的服务器将依赖于类A, B, C…但我无权更改它。理想情况下,我希望避免向它添加额外的初始化或序列化方法。

理想情况下,存储在数据库中的数据可以在某人执行sql查询后读取。(不以二进制格式存储)

我所尝试的是:

  1. 将数据转换为散列然后转换为json:A = classa_obj.to_h.to_json

  2. 存储到db:

    active_record_obj。Col_a = a

    active_record_obj.save

  3. 从db:

    检索记录query_result = # SQL query filter by id

  4. 将json部分转换回A类对象:

    classa_obj = ClassA.new(Json.parse(query_result.col_a))

这似乎工作,但我不确定它是否适用于一些更复杂的类结构

假设你有一个活动记录类称为用户,你想一个类对象存储在一个列的用户。然后您需要定义列为json类型和存储数据库作为散列中的数据。当您想要检索它时,可以初始化类a对象来反序列化它。下面是代码示例

class A
attr_reader :attr1, :attr2, :attr3
def initialize(attr1:, attr2:, attr3:)
@attr1 = attr1
@attr2 = attr2
@attr3 = attr3
end
def attributes
{
attr1: attr1,
attr2: attr2,
attr3: attr3
}
end
end
class User < ApplicationRecord
# class_object => json type column in users table
def class_object
A.new(**self[:class_object])
end
end
a = A.new(attr1: 1, attr2: 2, attr3: 3)
user = User.create(class_object: a.attributes)
user.class_object # => will return object from class A

相关内容

  • 没有找到相关文章

最新更新