如何在F#中JSON序列化数学向量类型?

The*_*ost 1 math serialization f# json

我正在尝试序列化"vector"(Microsoft.FSharp.Math)类型.我收到了这个错误:

异常详细信息:System.Runtime.Serialization.SerializationException:键入数据协定名称为"Instances.FloatNumerics_x0040_115:http://schemas.datacontract.org/2004/07/Microsoft "的"Microsoft.FSharp.Math.Instances+FloatNumerics@115" . FSharp.Math '不是预期的.将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.

我试图把KnownType属性和其他一些东西,但没有任何帮助!

有人能知道答案吗?这是我使用的代码:

// [< KnownType( typeof<vector> ) >]
type MyType = vector             

let public writeTest =
    let aaa = vector [1.1;2.2]
    let serializer = new DataContractJsonSerializer( typeof<MyType> )
    let writer = new StreamWriter( @"c:\test.txt" )
    serializer.WriteObject(writer.BaseStream, aaa)
    writer.Close()   
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 5

我认为F#vector类型没有为JSON序列化提供所有必要的支持(内部是一个非常复杂的类型).在您的情况下,最好的做法是将其转换为数组并序列化数组(这也肯定会生成更短,更高效的JSON).

转换非常简单:

let aaa = vector [1.1;2.2] 
let arr = Array.ofSeq aaa // Convert vector to array

// BTW: The 'use' keyword behaves like 'using' in C#
use writer = new StreamWriter( @"c:\test.txt" ) 
let serializer = new DataContractJsonSerializer() 
serializer.WriteObject(writer.BaseStream, aaa) 
Run Code Online (Sandbox Code Playgroud)

要将数组转换回向量,您可以使用Vector.ofSeq(这是Array.ofSeq上面示例中使用的对应项).