出于某种原因,当我序列化一个类型 (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/ ) 中没有提到 @...
最佳答案
F# 生成名为 key@
和 value@
的字段以支持名为 key
和 value
的属性。尝试在您的记录类型上放置一个 DataContract
属性 - 没有它,序列化程序将忽略 DataMember
属性并且似乎只是写出每个字段。
关于c# - DataContract/JsonSerializer '@' 附加到变量名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4207431/