2014-03-13 2 views
7

프레임 워크에서 묻는 것이 너무 많습니다. 그러나 그것이 가능할 지 궁금하다. 아니면이 문제를 해결할 것인가?Servicestack JSON 직렬화에서 F # Union 유형을 사용하는 방법은 무엇입니까?

새로운 릴리즈의 JSON.Net은 F # 공용체 유형을 지원하기 시작했습니다. 이를 해결하기 위해 servicestack.text를 사용하고 있다면 직렬화를 지원하기 위해 공용 유형을 어떻게 병합 할 수 있습니까?

다음은 두 가지 코드 샘플입니다.

type Shape = 
    | Rectangle of width : float * length : float 
    | Circle of radius : float 
    | Empty 


[<EntryPoint>] 
let main argv = 
// printfn "%A" argv 
    let shape1 = Rectangle(1.3, 10.0) 

    let json = JsonConvert.SerializeObject(shape1) //JSON.net 
    printfn "%A" json 
    // { 
    // "Case": "Rectangle", 
    // "Fields": [ 
    //  1.3, 
    //  10.0 
    // ] 
    // } 

    let shape2 = JsonConvert.DeserializeObject<Shape>(json) //JSON.Net 
    printfn "%A" (shape2 = shape1) //true 

    let sJson = JsonSerializer.SerializeToString shape1 //SS.Text 
    printfn "%A" sJson 

    let sShape2 = JsonSerializer.DeserializeFromString sJson //SS.Text 
    printfn "%A" (sShape2 = shape1) //false 

    Console.Read() |> ignore 
    0 // return an integer exit code 

servicestack을 사용한 직렬화 해제는 false를 반환합니다. 또한 JSON 문자열을 생성하는 것은 JSON.net과 비교할 때 매우 복잡합니다.

유니온 유형에 대한 올바른 직렬화를 달성하는 방법은 무엇입니까?

답변

2

사용자 지정 serializer에 ServiceStack을 제공해야합니다. 당신이 match이 일치하지 않는 처리하는 것, 그리고 floatSystem.FormatException을 올릴 수 있습니다

open ServiceStack.Text 

type Shape = 
    | Circle of float 
    | Empty 

JsConfig<Shape>.SerializeFn 
    <- Func<_,_> (function 
        | Circle r -> sprintf "C %f" r 
        | Empty -> sprintf "E") 

JsConfig<Shape>.DeSerializeFn 
    <- Func<_,_> (fun s ->  
        match s.Split [| |] with 
        | [| "C"; r |] -> Circle (float r) 
        | [| "E" |] -> Empty) 

let shapes = [| Circle 8.0 |] 
let json = JsonSerializer.SerializeToString(shapes) 
let shapes1 = JsonSerializer.DeserializeFromString<Shape[]>(json) 
let is_ok = shapes = shapes1 

이 코드는 디시리얼라이저에서 적절한 예외 전파가 없습니다 : 그것은 간결을위한 작은 모양 유형을 사용하여,이 싶습니다 .

+0

작동합니다. 그룹에 대한 주제를 논의했습니다. 그리고 나는 양털에 대해서 알게되었습니다. 답변을 샘플로도 업데이트 할 수 있다면 좋을 것입니다. JSON에 대한 공용체 유형 직렬화에 관한 문제를 해결할 것으로 생각됩니다. – kunjee

관련 문제