1

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
4

0 に答える 0