DataContract / JsonSerializer '@' добавляется к именам переменных - PullRequest
3 голосов
/ 17 ноября 2010

По какой-то причине, когда я сериализирую тип (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, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089], [System.Int32, mscorlib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089]] 'не может быть десериализирована'ключ @, значение @' членов не найдено. "}

Однако верните @ обратно:

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

и мы все в порядке.Насколько я знаю, в Json Spec нет ссылки на @ (http://www.json.org/)...

1 Ответ

5 голосов
/ 17 ноября 2010

F # создает поля с именами key@ и value@ для поддержки свойств с именами key и value.Попробуйте добавить атрибут DataContract к вашему типу записи - без него сериализатор будет игнорировать атрибуты DataMember и, по-видимому, просто записывает каждое поле.

...