【问题标题】:how can I serialize tuples as list in F#?如何在 F# 中将元组序列化为列表?
【发布时间】:2020-05-02 08:29:21
【问题描述】:

我有一个库向我发送包含元组的结果。我需要处理一些数据,对其进行序列化,然后将其传输到另一个系统。

元组总是由 2 个值组成,但在序列化时非常浪费:

(3, 4)

将序列化为:

{"Item1":3,"Item2":4}

[3; 4]

将序列化为:

[3,4]

我想避免重建整个数据结构并复制所有数据来更改这部分。

有没有办法在序列化器级别将元组转换为列表?

可以轻松更改下一个进程的解析器以适应列表而不是元组,因此这似乎是最好的方案。

丑陋的选择是用正则表达式修复序列化字符串,但我真的很想避免这样做。

【问题讨论】:

  • 肯定有办法在序列化程序级别解决这个问题,但如何做到这一点完全取决于您使用的序列化程序。 (Newtonsoft?,自定义?)

标签: serialization f# json.net


【解决方案1】:

您可以通过指定自己的JsonConverter 来覆盖默认的序列化行为。以下示例显示了将 int * int 元组写入二元素 JSON 数组的格式化程序。

open Newtonsoft.Json

type IntIntConverter() = 
  inherit JsonConverter<int * int>()
  override x.WriteJson(writer:JsonWriter, (a:int,b:int), serializer:JsonSerializer) =
    writer.WriteStartArray()
    writer.WriteValue(a)
    writer.WriteValue(b)
    writer.WriteEndArray()

  override x.ReadJson(reader, objectType, existingValue, hasExistingValue, serializer) = 
    (0, 0)

let sample = [ (1,2); (3,4) ]
let json = JsonConvert.SerializeObject(sample, Formatting.None, IntIntConverter())

运行结果将是[[1,2],[3,4]]。请注意,我还没有实现 ReadJson 方法,因此您还不能解析元组。这将涉及一些额外的工作,但您可以查看现有的 JsonConverters 以了解应该如何完成。

另请注意,这是针对包含两个整数的特定元组类型。如果您需要支持其他元组,您可能需要提供转换器的几种变体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 2018-10-22
    • 2021-11-22
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多