JSONのシリアル化に大きな問題があります。c#JSONを使用してラージオブジェクトをシリアライズ
私のアプリには、次の機能がWeb APIコントローラの1つで定義されています。
[HttpGet]
[ActionName("all")]
[Route("api/customers/all/")]
[SwaggerResponse(HttpStatusCode.InternalServerError, Type = typeof(Models.Response.ResponseError))]
[SwaggerResponse(HttpStatusCode.Forbidden, Type = typeof(Models.Response.ResponseErrorBasic))]
public Models.Response.ResponseApiList<Models.Api.Customer> GetValuesAll(DateTime? since=null)
Models.Api.Customerは、いくつかの関連オブジェクトを参照する複雑なオブジェクトです。
public class Customer
{
public int Id { get;set;}
public string Name {get;set}
.....
public List<Invoices> Invoices {get;set;}
.....
.....
}
Models.Response.ResponseApiListは
public class ResponseApiList<T>
{
public ResponseMeta meta { get; set; } // ResponseMeta holds datetime and total records
public List<T> payload { get; set; } // Holds the Customer object
public ResponseApiList()
{
payload = new List<T>();
meta = new ResponseMeta();
}
最後に、次はWebApiConfig
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
にNewtonSoft.JSONライブラリがロードされているが、確認していないされて返されたデータを保持していますそれが使用されているかどうかを調べるためのもの。
とにかく、問題はパフォーマンスです。現在、約11,000レコードが処理対象のデータベースから返されますが、データの合計サイズ(フィーダーが通知するものに基づいて)は45Mbsです。
c#コードが関数から返された場合、実行された合計時間は約です。 4秒。
その後、非常に長い間は何もありません。今日私は11:43にプロセスを開始し、15:34まで停止しませんでした。私のテストツールは、ReadyAPI(SoapUI)とInsomniaです。
最終的に、これはページングされた呼び出しに変換され、送信されるデータの量が削減されますが、JSONをWeb APIメソッドから返す制限はありますか?
私がコード変更ルートを下る前に、他の方法でこれを行う方法はありますか?
すべてのJSONシリアライザ/デシリアライザは内部的にReflectionを使用してJSONをオブジェクトに変換します。逆もまた同様です。非常に大きなオブジェクトの場合、最終的には時間がかかりますが、サイズにはどのくらいの時間がかかります。あなたは私がユーザーがそれらをすべて読むことができないと信じているUIに11,000のレコードをすべて表示していますか?代わりに、ページ区切りを使用してオンデマンドでフェッチすることができます。一度にすべてのレコードを取得することで何を達成しようとしているのか教えてください。私は、逐次化のロジックを変更せずに、さまざまなことを実現したいと考えています。 – Rex