Open marklam opened 1 year ago
You need to provide the generic type parameter:
open System.IO
open System.Collections.Immutable
open MBrace.FsPickler
let mkPickler<'t> (resolver : IPicklerResolver) =
let tPickler = resolver.Resolve<'t> ()
let intPickler = resolver.Resolve<int> ()
let writer (w : WriteState) (ns : ImmutableList<'t>) =
let tArr = ns |> Seq.toArray
intPickler.Write w "cnt" tArr.Length
tArr
|> Array.iter (fun t ->
tPickler.Write w "value" t
)
let reader (r : ReadState) : ImmutableList<'t> =
let l = intPickler.Read r "cnt"
let tArr =
[|0..(l-1)|]
|> Array.map (fun _ ->
tPickler.Read r "value"
)
ImmutableList.CreateRange<'t> tArr
Pickler.FromPrimitives(reader, writer)
let resolver : IPicklerResolver =
let registry = CustomPicklerRegistry()
registry.RegisterFactory mkPickler
PicklerCache.FromCustomPicklerRegistry registry
let p = mkPickler<int> resolver
let binarySerializer = FsPickler.CreateBinarySerializer() //picklerResolver = resolver)
let storeAndCount value =
use s = new MemoryStream()
binarySerializer.Serialize (s, value, p)
s.ToArray().Length
let items = seq { 1 .. 100 }
let immutableList = ImmutableList.CreateRange items
printfn "Storing ImmutableList gives %d bytes" (storeAndCount immutableList)
let resolver2 : IPicklerResolver =
let registry = CustomPicklerRegistry()
registry.RegisterFactory mkPickler<int>
PicklerCache.FromCustomPicklerRegistry registry
let binarySerializer2 = FsPickler.CreateBinarySerializer(picklerResolver = resolver2)
let storeAndCount2 value =
use s = new MemoryStream()
binarySerializer2.Serialize (s, value)
s.ToArray().Length
printfn "Storing items gives %d bytes" (storeAndCount2 items)
printfn "Storing ImmutableList gives %d bytes" (storeAndCount2 immutableList)
/// Registers a user-specified pickler factory
member __.RegisterFactory<'T>(factory : IPicklerResolver -> Pickler<'T>) : unit =
registerPickler (fun () -> picklerFactories.[typeof<'T>] <- fun r -> factory r :> Pickler)
Here's what I've tried:
But the ImmutableList doesn't seem to trigger my serializer: