Пример кода для чтения данных из Freebase Джомо Фишером использует DataContractJsonSerializer
для загрузки данных в неизменяемые записи F #.Объявление записи, которую он использует, выглядит следующим образом:
[<DataContract>]
type Result<'TResult> = { // '
[<field: DataMember(Name="code") >]
Code:string
[<field: DataMember(Name="result") >]
Result:'TResult // '
[<field: DataMember(Name="message") >]
Message:string }
Ключевым моментом здесь является то, что атрибут DataMember
присоединен к базовому полю, которое фактически используется для хранения данных, а не ксвойство только для чтения, которое генерирует компилятор F # (с использованием модификатора field:
в атрибуте).
Я не уверен на 100%, будет ли это работать с другими типами сериализации (возможно, нет),но это может быть полезным указателем для начала ...
РЕДАКТИРОВАТЬ Я не уверен, что я что-то здесь упускаю, но следующий базовый пример отлично работает для меня:
module Demo
#r "System.Runtime.Serialization.dll"
open System.IO
open System.Text
open System.Xml
open System.Runtime.Serialization
type Test =
{ Result : string[]
Title : string }
do
let sb = new StringBuilder()
let value = { Result = [| "Hello"; "World" |]; Title = "Hacking" }
let xmlSerializer = DataContractSerializer(typeof<Test>);
xmlSerializer.WriteObject(new XmlTextWriter(new StringWriter(sb)), value)
let sr = sb.ToString()
printfn "%A" sr
let xmlSerializer = DataContractSerializer(typeof<Test>);
let reader = new XmlTextReader(new StringReader(sr))
let obj = xmlSerializer.ReadObject(reader) :?> Test
printfn "Reading: %A" obj
РЕДАКТИРОВАТЬ 2 Если вы хотите создать более чистый XML, вы можете добавить такие атрибуты, как это:
[<XmlRoot("test")>]
type Test =
{ [<XmlArrayAttribute("results")>]
[<XmlArrayItem(typeof<string>, ElementName = "string")>]
Result : string[]
[<XmlArrayAttribute("title")>]
Title : string }