open System.Collections.Generic
open System.Runtime.Serialization.Formatters
open System.ComponentModel.DataAnnotations
open System.Globalization
open Newtonsoft.Json.Linq
open Newtonsoft.Json.Converters
open Newtonsoft.Json.Serialization
let jsonToStream(value:'T) =
let serializer = JsonSerializer.CreateDefault()
let std = new IO.MemoryStream()
( use sw = new StreamWriter(std, new UTF8Encoding(false, true), 4096, true)
use json = new JsonTextWriter(sw, CloseOutput = false)
serializer.Serialize(json, value))
let jsonFromStream<'T>(stream : Stream) =
Console.WriteLine(typeof<'T>)
let serializer = JsonSerializer.CreateDefault()
use rdr = new StreamReader(stream, Encoding.UTF8, true, 4096, true)
use jrdr = new JsonTextReader(rdr, CloseInput = false)
let res = serializer.Deserialize<'T>(jrdr)
Console.WriteLine(res.GetType())
let jsonSeqFromStream<'T>(stream : Stream) =
let serializer = JsonSerializer.CreateDefault()
use rdr = new StreamReader(stream, Encoding.UTF8, true, 4096, true)
use jrdr = new JsonTextReader(rdr, CloseInput = false)
if (jrdr.TokenType = JsonToken.Comment) then
elif (jrdr.TokenType = JsonToken.StartArray && not !inArray) then
elif (jrdr.TokenType = JsonToken.EndArray && !inArray) then
let res = serializer.Deserialize<'T>(jrdr)
type someType (Id:string) =
let l = seq {1 .. 5 } |> Seq.map (fun i -> new someType(i.ToString()))
let stream = jsonToStream(l)
let mySeq = jsonSeqFromStream<someType>(stream)
printfn "First pass through the sequence:"
mySeq |> Seq.iter (fun (s) -> printfn "%s" (JsonConvert.SerializeObject(s)))
printfn "Second pass through the sequence (should be empty):"
mySeq |> Seq.iter (fun (s) -> printfn "%s" (JsonConvert.SerializeObject(s)))