1

.net 4.0 と wcf サービスを使用しています。[Datacontract]属性で定義されていないビジネス エンティティ クラスがあります。

タイプ ビジネス エンティティ クラスの 1000 未満のレコードを取得しようとすると正常に動作しますが、タイプ ビジネス エンティティ クラスの 1000 を超えるレコードを取得しようとすると、次の例外がスローされます。

メッセージを逆シリアル化しようとしているときにフォーマッタが例外をスローしました: パラメータ http://tempuri.org/:Securitiesを逆シリアル化しようとしているときにエラーが発生しました。InnerException メッセージは、「オブジェクト グラフでシリアライズまたはデシリアライズできる項目の最大数は 65536 です」でした。オブジェクト グラフを変更するか、MaxItemsInObjectGraph クォータを増やしてください。'。詳細については、InnerException を参照してください。

[DataContract]ビジネスエンティティクラスに定義された属性を使用すると、問題が解決しました。

  1. [DataContract]上記の場合、属性はどのような重要性を果たしますか?
  2. [DataContract]属性付きで定義されたビジネスエンティティクラスと属性なしで定義されたビジネスエンティティクラスの使用の違いは何[DataContract]ですか?
4

1 に答える 1

7

クラスに適用することで、 DataContractSerializer[DataContract]によってシリアル化されるプロパティを明示的に宣言することを WCF に伝えます。

デフォルトでは、DCS なし[DataContract]で、DCS はすべてのパブリック プロパティをシリアル化します。たとえば、以下の場合、House のインスタンスをシリアル化すると、Window と Door も完全にシリアル化されます。

public class Window
{
  public string Colour {get; set;}
  public bool IsClean {get; set; }
}


public class Door
{
  public string Colour {get; set;}
  public bool IsOpen {get; set; }
}


public class House
{
  public Door Door {get; set;}
  public Window Window {get; set; }
}

比較すると、[DataContract]on House を指定すると、属性を持つメンバーのみ[DataMember]がシリアル化されます。つまり、以下の場合、House の Address プロパティのみがシリアル化されます。

[DataContract]
public class House
{
  [DataMember]
  public string Address {get; set;}

  // Omitted DataMember!
  public Door Door {get; set;}
  public Window Window {get; set; }
}

[DataContract]あなたのケースで追加が機能する理由は、おそらく[DataMember]ルートエンティティに追加したためだと思いますが、エンティティグラフの「チェーン」のどこかで、1 つ以上の複合エンティティに属性がありません。[DataContract]ルート エンティティを sなしでマークしたばかりの場合[DataMember]、ルート エンティティのみがシリアル化されるため、設定を回避できMaxItemsInGraphます (ただし、クライアントは明らかに、シリアル化されていないエンティティを受け取りません)。

于 2012-08-01T06:44:53.280 に答える