2017-07-04 7 views
0

に速いJSONデータをデシリアライズ:ロード/ IはNewtonsoft.Jsonを使用する私のコードではC#のオブジェクト

MyCSharpTargetClass foo = JsonConvert.DeserializeObject<MyCSharpTargetClass>(json_string); 

json_stringの内容は、(変更されることのないファイルからロードされた)一定です。

機能は正常ですが、デシリアライズ処理は実行時に遅くなります。

私の質問:オブジェクトを事前に計算したり、定数*に入れたり、実行を高速化する方法はありますか?

注:実際には、JsonConvert.DeserializeObject < ...>()の結果を定数にすることはできませんでしたが、私はC#を初めて使用しています。あなたの助けのための

おかげ

[EDIT]策:アプリケーションの起動時にロードするNewtonsoftアセンブリを強制します。

+0

あなたのプロジェクトタイプは? Winforms?ウェブ?コンソール? – msd

+0

_「デシリアライズ処理が実行時に遅い」_ - それはどういうことですか?どのように判断しましたか? _that_は大きいですか?また、なぜそれが変わったかを知るために何度もそれを読んでいますか?それが大きなファイルの場合、関連する部分を読むだけではどうですか?なぜあなたはファイルのイベントを監視できませんか? – CodeCaster

+0

@msd:アプリケーションUWP(主にWindows 10のモバイル用) –

答えて

1

これをスピードアップするには、実際にはたくさんのことは考えていません。

  1. ignore属性を使用しているため、このフィールドは追加されません。このプロパティは、後で再計算することができる一部のプロパティまたは計算可能なプロパティ/フィールドに使用します。このリンクが役立ちます 希望:あなたがスレッドで/デシリアライズを多くのファイルにデータをカスタマイズしてシリアライズすることができた場合、あなたのオブジェクトを読み出し/書き込みするためのスレッドを使用し

    https://msdn.microsoft.com/en-us/library/system.runtime.serialization.ignoredatamemberattribute.aspx

  2. 逆シリアル化JSONアルゴリズムでは、ファイル全体を約3回読み取る必要があります。 パフォーマンスを向上させるために、YAMLを使用できます。 XML/JSONと同じようにシンプルですが、ファイルを1回だけ読み込むのでパフォーマンスは大幅に向上します。
  3. フィールドに短いDataMember[DataMember(Name = "id")] public int MyObjectForSomethink{get;set;}
+1

3番をサポートする証拠はありますか?私はこれまで、JSONファイル全体を単一のパスで段階的に読み取ることに問題はありませんでした。 –

1

あなたはそれをあなたが他のオブジェクトと同じようやるの使用:それは、値が正確に一度計算されprivateメンバ変数、作る:

private static readonly MyCSharpTargetClass foo = JsonConvert.DeserializeObject<MyCSharpTargetClass>(json_string); 

をまたは、コンストラクタでそれを行います:

private readonly MyCSharpTargetClass foo; 

public MyObject() 
{ 
    foo = JsonConvert.DeserializeObject<MyCSharpTargetClass>(json_string); 
} 

そのように作業する文字列をrializeすると、一回だけ実行されます。