You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sorbet T::Struct的序列化与反序列化相关问题咨询

解决方案1:使用Sorbet官方自带的 T::Struct::Serializable

Sorbet 官方提供了原生的序列化/反序列化扩展,不需要额外引入第三方依赖,开箱支持类型校验和自定义类型转换,直接复用已有的T::Struct类型定义即可,无需额外编写重复的字段声明。

修改你的Struct定义,引入该模块并配置自定义转换规则:

require 'sorbet-runtime'

class Order < T::Struct
  include T::Struct::Serializable

  prop :order_id, String
  prop :amount, Integer
  prop :currency, String
  # 为日期字段指定序列化/反序列化逻辑
  prop :submitted_at, DateTime,
    serialize: ->(dt) { dt.iso8601 },
    deserialize: ->(str) { DateTime.parse(str) }
end

序列化直接使用原有to_json方法即可,反序列化直接调用类方法from_json:

# 反序列化示例
json_str = File.read("ORD-001.json")
order = Order.from_json(json_str)

如果字段类型不匹配,或者自定义转换逻辑执行失败,会直接抛出明确的类型错误,完全满足类型校验的需求。


解决方案2:使用社区gem sorbet-coerce 实现更灵活的转换

如果你需要更复杂的转换能力(比如嵌套T::Struct、数组类型转换、全局自定义类型映射、自定义错误处理逻辑等),可以使用社区广泛使用的sorbet-coerce gem:

安装gem

在Gemfile中添加:

gem 'sorbet-coerce'

反序列化使用示例

require 'sorbet-coerce'

json_hash = JSON.parse(File.read("ORD-001.json"), symbolize_names: true)
# 自动按照Order的类型定义做类型转换和校验
order = T::Coerce::Params[Order].from_hash(json_hash)

你可以为任意类型注册全局的转换规则,比如全局定义字符串转DateTime的逻辑:

T::Coerce::Params.register_converter(DateTime) do |value|
  next value if value.is_a?(DateTime)
  DateTime.parse(value.to_s)
rescue ArgumentError
  # 自定义类型不匹配的处理逻辑,比如抛自定义错误、返回默认值等
  raise "无效的日期格式: #{value}"
end

内容的提问来源于stack exchange,提问作者leifg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:27:01