As always, It Depends™. How do you define best?
Do you want the fastest serialization? Most sustainable code base? Design-by-contract?
It’s been a few years since I last did work in that area, but back then, I wrote several (level 3) REST APIs in F#, and my go-to technology for serialization was the JSON and XML type providers.
With the type providers, you define, using examples, what the JSON or XML should actually look like on the wire, and the type provider then infers the F# records from the examples.
In my situation, it was of the utmost importance that once an external contract was established, breaking changes shouldn’t happen. Designing the contract with actual JSON and XML gave me an easily manageable way to do that, and the types just became available based on the actual JSON or XML examples. I checked the JSON and XML examples into Git so that I could keep track of changes in the contract.
I never did any performance measurements of that technology choice, since it was easily fast enough for my purposes… YMMV.