FSharp.Data.JsonProvider.Serializer 1.0.2
dotnet add package FSharp.Data.JsonProvider.Serializer --version 1.0.2
NuGet\Install-Package FSharp.Data.JsonProvider.Serializer -Version 1.0.2
<PackageReference Include="FSharp.Data.JsonProvider.Serializer" Version="1.0.2" />
paket add FSharp.Data.JsonProvider.Serializer --version 1.0.2
#r "nuget: FSharp.Data.JsonProvider.Serializer, 1.0.2"
// Install FSharp.Data.JsonProvider.Serializer as a Cake Addin #addin nuget:?package=FSharp.Data.JsonProvider.Serializer&version=1.0.2 // Install FSharp.Data.JsonProvider.Serializer as a Cake Tool #tool nuget:?package=FSharp.Data.JsonProvider.Serializer&version=1.0.2
FSharp.Data.JsonProvider.Serializer
NuGet包: https://nuget.net.cn/packages/FSharp.Data.JsonProvider.Serializer/ 此包不是独立包,您仍将使用现有的JsonProvider。
这将提供使用快速System.Text.Json
库序列化FSharp.Data.JsonProvider
项的实用工具。
- FSharp.Data: https://fsprojects.github.io/FSharp.Data/
- System.Text.Json: https://nuget.net.cn/packages/System.Text.Json
动机:序列化速度。通常JSON序列化用于用户查看进度条或在大批量处理中。
当前FSharp.Data使用自定义Json序列化器。
我们需要一个折衷的方案,既有F# JsonProvider的便利性,又有System.Text.Json的速度。
这个方案的想法是替换当前的函数。
从类型提供程序中读取值(反序列化)
当前FSharp.Data.JsonProvider
type MyJsonType = FSharp.Data.JsonProvider<"""{ "model": "..." } """>
let fromJson (response:string) = MyJsonType.Parse response
使用这个库
type MyJsonType = FSharp.Data.JsonProvider<"""{ "model": "..." } """>
let fromJson (response:string) = MyJsonType.Load (Serializer.Deserialize response)
从类型提供程序中保存值(序列化)
当前FSharp.Data.JsonProvider
type MyJson = FSharp.Data.JsonProvider<"""{ "model": "..." } """>
let toJson mymodel = mymodel.JsonValue.ToString()
使用这个库
type MyJson = FSharp.Data.JsonProvider<"""{ "model": "..." } """>
let toJson mymodel = Serializer.Serialize (mymodel.JsonValue)
除此之外,您仍然可以像以前一样继续使用现有的JsonProvider实现。目前它使用System.Text.Json风格的编码引号字符等,但如果您想进一步自定义序列化,可以将JsonReaderOptions和JsonWriterOptions作为参数设置。
初始基准测试
FSharp.Data 6.3,System.Text.Json 8.0
测试用例
- 将JSON读取到JsonProvider。(序列化)
- 验证一个属性
- 将JSON保存回字符串。(反序列化)
使用了小型JSON文件以及Stripe OpenAPI规范文件(+5MB的JSON)进行了测试。
BenchmarkDotNet v0.13.10,Windows 11(10.0.22621.2715/22H2/2022Update/SunValley2)第13代英特尔酷睿i9-13900H,1个CPU,20个逻辑和14个物理核心
.NET 8.0 : .NET 8.0.0 (8.0.23.53103),X64 RyuJIT AVX2
方法 | 平均值 | 误差 | 标准差 | Gen0 | Gen1 | Gen2 | 分配的 |
---|---|---|---|---|---|---|---|
SmallJson_JsonProvider | 2.789 μs | 0.0314 μs | 0.0293 μs | 0.4120 | - | - | 5.06 KB |
SmallJson_SystemTextJson | 1.623 μs | 0.0308 μs | 0.0288 μs | 0.2651 | - | - | 3.27 KB |
ListOf1000SmallJsons_JsonProvider | 2,849.210 μs | 25.9458 μs | 20.2568 μs | 351.5625 | 175.7813 | 58.5938 | 4224.8 KB |
ListOf1000SmallJsons_SystemTextJson | 1,424.314 μs | 9.3599 μs | 8.7553 μs | 199.2188 | 199.2188 | 199.2188 | 2469.76 KB |
StripeJson_JsonProvider | 83,610.123 μs | 1,667.5590 μs | 3,406.3812 μs | 5285.7143 | 4571.4286 | 1714.2857 | 60521.87 KB |
StripeJson_SystemTextJsonBytes | 42,775.639 μs | 822.2020 μs | 1,009.7378 μs | 2333.3333 | 2166.6667 | 750.0000 | 44305.47 KB |
.NET Framework 4.8 : .NET Framework 4.8.1 (4.8.9181.0),X64 RyuJIT VectorSize=256
方法 | 平均值 | 误差 | 标准差 | Gen0 | Gen1 | Gen2 | 分配的 |
---|---|---|---|---|---|---|---|
SmallJson_JsonProvider | 6.613 μs | 0.0554 μs | 0.0518 μs | 0.8621 | - | - | 5.32 KB |
SmallJson_SystemTextJson | 4.832 μs | 0.0542 μs | 0.0480 μs | 0.5493 | - | - | 3.4 KB |
ListOf1000SmallJsons_JsonProvider | 7,052.777 μs | 53.6100 μs | 47.5238 μs | 695.3125 | 343.7500 | 54.6875 | 4465.7 KB |
ListOf1000SmallJsons_SystemTextJson | 4,453.736 μs | 43.9446 μs | 41.1058 μs | 390.6250 | 195.3125 | 195.3125 | 2587.36 KB |
StripeJson_JsonProvider | 107,016.899 μs | 2,094.9813 μs | 3,500.2432 μs | 8200.0000 | 3800.0000 | 1400.0000 | 61612.22 KB |
StripeJson_SystemTextJsonBytes | 77,002.389 μs | 1,531.7106 μs | 2,559.1443 μs | 4285.7143 | 2285.7143 | 1000.0000 | 45245.97 KB |
要运行测试:dotnet run --project tests\Benchmarks\BenchmarkTests.fsproj --configuration=Release --framework=net8.0
API
FSharp.Data使用内部类FSharp.Data.JsonValue
来表示JSON域。
从JSON到JsonProvider
Deserialize
:将字符串转换为FSharp.Data.JsonValueDeserializeWith
:字符串和System.Text.Json.JsonReaderOptions转换为FSharp.Data.JsonValueDeserializeBytes
:字节数组转换为FSharp.Data.JsonValueDeserializeBytesWith
:字节数组和System.Text.Json.JsonReaderOptions转换为FSharp.Data.JsonValue
从JsonProvider到JSON
Serialize
:FSharp.Data.JsonValue转换为字符串SerializeWith
:FSharp.Data.JsonValue和System.Text.Json.JsonWriterOptions转换为字符串SerializeBytes
:FSharp.Data.JsonValue转换为字节数组SerializeBytesWith
:FSharp.Data.JsonValue和System.Text.Json.JsonWriterOptions转换为字节数组
从JsonProvider到JSON,流式传输
有了流支持,您可以将JSON数据记录逐记录地发送到输出流。
SerializeStream
:目标流,FSharp.Data.JsonValueSerializeStreamWith
:目标流,FSharp.Data.JsonValue和System.Text.Json.JsonWriterOptions
流可能保持与相同的表现特性,但略微减少内存分配,并更快提供部分可消费的结果,如果JSON文件很大且客户端支持流。
.NET 8.0 : .NET 8.0.0 (8.0.23.53103),X64 RyuJIT AVX2
方法 | 平均值 | 误差 | 标准差 | Gen0 | Gen1 | Gen2 | 分配的 |
---|---|---|---|---|---|---|---|
ListOf1000SmallJsons_SystemTextJsonStream | 1,525.970 μs | 14.0992 μs | 13.1884 μs | 158.2031 | 117.1875 | 78.1250 | 2100.46 KB |
StripeJson_SystemTextJsonStream | 47,112.065 μs | 805.5929 μs | 753.5521 μs | 2333.3333 | 2250.0000 | 750.0000 | 31560.25 KB |
.NET Framework 4.8 : .NET Framework 4.8.1 (4.8.9181.0),X64 RyuJIT VectorSize=256
方法 | 平均值 | 误差 | 标准差 | Gen0 | Gen1 | Gen2 | 分配的 |
---|---|---|---|---|---|---|---|
ListOf1000SmallJsons_SystemTextJsonStream | 4,650.089 μs | 34.2087 μs | 30.3251 μs | 312.5000 | 156.2500 | 78.1250 | 2217.05 KB |
StripeJson_SystemTextJsonStream | 76,921.557 μs | 1,448.2545 μs | 1,778.5866 μs | 4000.0000 | 2000.0000 | 1000.0000 | 32501.88 KB |
产品 | 版本 兼容和额外的计算目标框架版本。 |
---|---|
.NET | net5.0 已计算。 net5.0Windows 已计算。 net6.0 已计算。 net6.0Android 已计算。 net6.0iOS 已计算。 net6.0MacCatalyst 已计算。 net6.0macOS 已计算。 net6.0tvOS 已计算。 net6.0Windows 已计算。 net7.0 已计算。 net7.0Android 已计算。 net7.0iOS 已计算。 net7.0MacCatalyst 已计算。 net7.0macOS 已计算。 net7.0tvOS 已计算。 net7.0Windows 已计算。 net8.0 兼容。 net8.0Android 已计算。 net8.0Browser 已计算。 net8.0iOS 已计算。 net8.0MacCatalyst 已计算。 net8.0macOS 已计算。 net8.0tvOS 已计算。 net8.0Windows 已计算。 |
.NET Core | netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。 |
.NET标准 | netstandard2.0 兼容。 netstandard2.1 兼容。 |
.NET框架 | net461已计算。 net462已计算。 net463已计算。 net47已计算。 net471已计算。 net472已计算。 net48兼容。 net481已计算。 |
MonoAndroid | monoandroid已计算。 |
MonoMac | monomac已计算。 |
MonoTouch | monotouch已计算。 |
Tizen | tizen40已计算。 tizen60已计算。 |
Xamarin.iOS | xamarinios已计算。 |
Xamarin.Mac | xamarinmac已计算。 |
Xamarin.TVOS | xamarintvos已计算。 |
Xamarin.WatchOS | xamarinwatchos已计算。 |
-
.NET Framework 4.8
- FSharp.Core (>= 8.0.301)
- FSharp.Data.Json.Core (>= 6.4.0)
- System.Text.Json (>= 8.0.4)
-
.NET Standard 2.0
- FSharp.Core (>= 8.0.301)
- FSharp.Data.Json.Core (>= 6.4.0)
- System.Text.Json (>= 8.0.4)
-
.NET Standard 2.1
- FSharp.Core (>= 8.0.301)
- FSharp.Data.Json.Core (>= 6.4.0)
- System.Text.Json (>= 8.0.4)
-
net8.0
- FSharp.Core (>= 8.0.301)
- FSharp.Data.Json.Core (>= 6.4.0)
- System.Text.Json (>= 8.0.4)
NuGet包 (1)
显示依赖FSharp.Data.JsonProvider.Serializer的顶级1个NuGet包
包 | 下载 |
---|---|
ProveSDK
非官方Prove .NET客户端 |
GitHub仓库
此包未用于任何流行的GitHub仓库。