Serialization 如何将元组序列化为F#中的列表?

Serialization 如何将元组序列化为F#中的列表?,serialization,f#,json.net,Serialization,F#,Json.net,我有一个库,它向我发送包含元组的结果。我需要处理一些数据,将其序列化,然后将其传送到另一个系统 元组总是由2个值组成,但序列化时它们非常浪费: (3, 4) 将序列化为: {"Item1":3,"Item2":4} [3,4] 鉴于 [3; 4] 将序列化为: {"Item1":3,"Item2":4} [3,4] 我希望避免重建整个数据结构并复制所有数据来更改此部分 在序列化程序级别,是否有方法将元组转换为列表 下一个进程的解析器可以很容易地更改,以适应列表而不是元组,因此这似乎是

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

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

(3, 4)
将序列化为:

{"Item1":3,"Item2":4}
[3,4]
鉴于

[3; 4]
将序列化为:

{"Item1":3,"Item2":4}
[3,4]
我希望避免重建整个数据结构并复制所有数据来更改此部分

在序列化程序级别,是否有方法将元组转换为列表

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


丑陋的选项是用正则表达式修复序列化字符串,但我确实希望避免这样做。

您可以通过指定自己的
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())
打开Newtonsoft.Json
键入IntIntConverter()=
继承JsonConverter()
重写x.WriteJson(writer:JsonWriter,(a:int,b:int),序列化程序:JsonSerializer)=
writer.writestarray()
writer.WriteValue(a)
writer.WriteValue(b)
writeneDarray()
重写x.ReadJson(读取器、对象类型、existingValue、hasExistingValue、序列化程序)=
(0, 0)
设样本=[(1,2);(3,4)]
让json=JsonConvert.SerializeObject(示例,格式化.None,IntIntConverter())
运行此操作的结果将是
[[1,2],[3,4]]
。请注意,我尚未实现
ReadJson
方法,因此您还无法解析元组。这将涉及一些额外的工作,但您可以查看现有的
JsonConverter
s,了解应该如何完成这项工作


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

您可以通过指定自己的
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())
打开Newtonsoft.Json
键入IntIntConverter()=
继承JsonConverter()
重写x.WriteJson(writer:JsonWriter,(a:int,b:int),序列化程序:JsonSerializer)=
writer.writestarray()
writer.WriteValue(a)
writer.WriteValue(b)
writeneDarray()
重写x.ReadJson(读取器、对象类型、existingValue、hasExistingValue、序列化程序)=
(0, 0)
设样本=[(1,2);(3,4)]
让json=JsonConvert.SerializeObject(示例,格式化.None,IntIntConverter())
运行此操作的结果将是
[[1,2],[3,4]]
。请注意,我尚未实现
ReadJson
方法,因此您还无法解析元组。这将涉及一些额外的工作,但您可以查看现有的
JsonConverter
s,了解应该如何完成这项工作


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

在序列化程序级别肯定有办法解决此问题,但如何解决完全取决于您使用的序列化程序。(Newtonsoft?、Custom?)在序列化程序级别肯定有办法解决这个问题,但如何解决完全取决于您使用的序列化程序。(Newtonsoft?、定制?)