代码之家  ›  专栏  ›  技术社区  ›  akaphenom

附加到变量名的DataContract/JsonSerializer“@”

  •  3
  • akaphenom  · 技术社区  · 15 年前

    当我序列化类型(f)时,出于某种原因:

    type JsonKeyValuePair<'T, 'S> =  {
        [<DataMember>] 
        mutable key : 'T
        [<DataMember>] 
        mutable value : 'S
    }
    
    let printJson() = 
    
        use stream = new MemoryStream() 
        use reader = new System.IO.StreamReader(stream)
    
        let o = {key = "a"; value = 1 }
        let jsonSerializer = Json.DataContractJsonSerializer(typeof<TestGrounds.JsonKeyValuePair<string, int>>)
    
        jsonSerializer.WriteObject (stream , o)
        stream.Seek(int64 0, SeekOrigin.Begin) |> ignore 
    
        printfn <| Printf.TextWriterFormat<unit>(reader.ReadToEnd())
        ()
    

    它生成一个字符串:

    {“key@”:“a”,“value@”:1}

    如果我试图在没有@符号的情况下将其合法化:

    let deserialize() = 
        let json = "{\"key\":\"b\",\"value\":2}"
        let o  = deserializeString<TestGrounds.JsonKeyValuePair<string, int>> json
        ()
    

    {“数据协定类型”TestGrounds.JsonKeyValuePair`2[[System.String,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089],[System.Int32,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]]'无法反序列化,因为找不到所需的数据成员的key@,value@'。”

    不过,把@放回:

    let run2 () = 
        let json = "{\"key@\":\"b\",\"value@\":2}"
        let o  = deserializeString<TestGrounds.JsonKeyValuePair<string, int>> json
        ()
    

    我们都很好。据我所知,Json规范中没有提到@( http://www.json.org/ )...

    1 回复  |  直到 15 年前
        1
  •  5
  •   kvb    15 年前

    生成名为 key@ value@ 要支持名为 key value . 试着放一个 DataContract 属性-如果没有它,序列化程序将忽略 DataMember 属性,似乎只是写出每个字段。