Json.Netの最新ビルドをテストしており、サーバー上でコレクションをシリアル化し、WCF プロキシを使用して文字列を渡しています。
サーバー呼び出しはデータを返すのに 1 秒もかかりませんが、PDA クライアント側ではデシリアライズJsonConvert.DeserializeObject(Of IList(Of BusinessUnitModel))(results)
に 20 ~ 30 秒かかります。
このパフォーマンスは Json.Net で通常のものですか、それともオブジェクトまたはシリアライゼーション/デシリアライゼーションで何か問題がありますか?
Json.Net の 3.5x バージョンにダウングレードして、サーバーで適切なバージョンを使用し、クライアントで Compact バージョンを使用しようとしましたが、パフォーマンスが再び低下します。
共有モデル
Imports System.ComponentModel.DataAnnotations
Namespace Models
Public Class BusinessUnitModel
<Required>
Public Property ID As Int32
<Required>
<StringLength(50)>
Public Property Name As String
<Required>
Public Property IsInternalSupplier As Boolean
End Class
End Namespace
サーバー側のシリアル化
Imports Qsmart.DataProvider.Contracts
Imports System.ComponentModel.Composition
Imports Newtonsoft.Json
Namespace Serialiser
<Export(GetType(IModelSerialiser))>
Public Class JSonSerialiser
Implements IModelSerialiser
<Import(GetType(ILoggerHelper))>
Private Property ExHelper As ILoggerHelper
Friend Function Deserailse(Of TModel)(serialised As String) As TModel Implements IModelSerialiser.Deserailse
If serialised Is Nothing Then Throw New ArgumentNullException("serialised")
Try
Return JsonConvert.DeserializeObject(serialised)
Catch ex As JsonSerializationException
ExHelper.Process(ex)
Throw New ApplicationException("Could Not Deserialse The Model", ex)
End Try
End Function
Friend Function Serailse(Of TModel)(model As TModel) As String Implements IModelSerialiser.Serailse
If model Is Nothing Then Throw New ArgumentNullException("model")
Try
Return JsonConvert.SerializeObject(model)
Catch ex As JsonSerializationException
ExHelper.Process(ex)
Throw New ApplicationException("Could Not Serialse The Model", ex)
End Try
End Function
End Class
End Namespace
サーバーサイドのテストデータ作成
Public Function QSmartBusinessUnits() As String Implements IQSmartDataProvider.QSmartBusinessUnits
Dim serialsedResult As String = String.Empty
Try
Dim tester As New List(Of BusinessUnitModel)
tester.Add(New BusinessUnitModel With {.ID = 1, .Name = "Test1", .IsInternalSupplier = True})
tester.Add(New BusinessUnitModel With {.ID = 2, .Name = "Test2", .IsInternalSupplier = True})
tester.Add(New BusinessUnitModel With {.ID = 3, .Name = "Test3", .IsInternalSupplier = True})
tester.Add(New BusinessUnitModel With {.ID = 4, .Name = "Test4", .IsInternalSupplier = True})
tester.Add(New BusinessUnitModel With {.ID = 5, .Name = "Test5", .IsInternalSupplier = True})
tester.Add(New BusinessUnitModel With {.ID = 6, .Name = "Test6", .IsInternalSupplier = True})
serialsedResult = Serialiser.Serailse(tester)
Catch ex As Exception
ExHelper.Process(ex)
End Try
Return serialsedResult
End Function
コンパクト フレームワークのデシリアライズ
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
Try
Dim results As String = _proxy.QSmartBusinessUnits()
Dim deserialise = JsonConvert.DeserializeObject(Of IList(Of BusinessUnitModel))(results)
BusinessUnitModelBindingSource.DataSource = deserialise
Catch ex As Exception
Stop
End Try
End Sub
アップデート
モデルから DataAnnotations を削除すると、パフォーマンスが大幅に向上し、約 2 秒に低下します...なぜそうなるのか考えていますか?
Imports System.ComponentModel.DataAnnotations
Namespace Models
Public Class BusinessUnitModel
Public Property ID As Int32
Public Property Name As String
Public Property IsInternalSupplier As Boolean
End Class
End Namespace