Il est souvent utile de sérialiser ou désérialiser des objets. Je vous propose ici un exemple utilisant le format JSON, qui est souvent utilisé pour les échanges réseau.

Pour cela, on utilise la classe DataContractJsonSerializer qui est apparue avec .NET 3.5 :

#r "System.Runtime.Serialization.dll"
#r "System.ServiceModel.Web.dll"
 
open System.IO
open System.Text
open System.Runtime.Serialization
open System.Runtime.Serialization.Json
 
let parseJSON<'a> (input: string) =
    use stream = new MemoryStream(Encoding.UTF8.GetBytes(input))
    let serializer = new DataContractJsonSerializer(typeof<'a>)
    serializer.ReadObject(stream) :?> 'a
 
let printJSON (obj: 'a) =
    use stream = new MemoryStream()
    let serializer = new DataContractJsonSerializer(typeof<'a>)
    serializer.WriteObject(stream, obj)
    Encoding.UTF8.GetString(stream.ToArray(), 0, int stream.Length)

Pour utiliser ces fonctions, il suffit d'ajouter l'annotation DataMember et de rendre mutable chaque propriété. Il faut aussi marquer le type avec l'attribut DataContract. Exemple avec une structure :

[<DataContract>]
type Person = {[<DataMember>] mutable Name: string
               [<DataMember>] mutable Age: int}
 
parseJSON<Person> @"{""Name"": ""Jean"", ""Age"": 29}"
 
printJSON {Name = "Pierre"; Age = 33}

Et un exemple avec une classe :

[<DataContract>]
type Group() =
    let mutable name = ""
    let mutable members = [||] : Person array
    [<DataMember>]
    member public this.Name with get() = name and set value = name <- value
    [<DataMember>]
    member public this.Members with get() = members and set value = members <- value
 
parseJSON<Group> @"{""Name"":""Pierre"", ""Members"":[{""Name"":""Pierre"", ""Age"": 33}]}"

Vous pouvez bien sûr essayer cet exemple en ligne avec tryfsharp.org.