Как JSON сериализовать математический векторный тип в F #? - PullRequest
1 голос
/ 21 мая 2010

Я пытаюсь сериализовать тип vector (Microsoft.FSharp.Math). И я получаю эту ошибку:

Сведения об исключении: System.Runtime.Serialization.SerializationException: введите «Microsoft.FSharp.Math.Instances+FloatNumerics@115» с именем контракта данных «Instances.FloatNumerics_x0040_115: http://schemas.datacontract.org/2004/07/Microsoft.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()   

Ответы [ 2 ]

5 голосов
/ 21 мая 2010

Я думаю, что тип 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) 

Чтобы преобразовать массив обратно в вектор, вы можете использовать Vector.ofSeq (что эквивалентно Array.ofSeq, использованному в примере выше).

4 голосов
/ 21 мая 2010

Вы также можете использовать:

let v = vector [1.;3.];
let vArr = v.InternalValues

, чтобы получить внутренний массив вектора.Таким образом, вам не нужно создавать временный массив.

Типы, RowVector, Matrix также имеют этот метод для получения внутренних массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...