1

WCF を使用してシリアル化しようとしているかなり複雑なオブジェクト モデルがあります。サーバーで新しいインスタンスを作成してクライアントに返すことができるという問題が発生しています。その後、同じオブジェクトを戻そうとしたり、DataContractSerializer を使用してシリアル化しようとすると、例外がスローされます。

テスト メソッド Server.Service.Test.SerializationTest.TestFilingSerialization が例外をスローしました: System.Runtime.Serialization.SerializationException: MyNameSpace.MyObject 型のオブジェクトを逆シリアル化中にエラーが発生しました。タイプ '' のプロパティ '' の set メソッドがありません

欠落しているセッターに関する情報は提供されません。欠落しているセッターの継承階層を調べてみましたが、これを渡すことができないようです。 MyObjectは、シリアル化しようとしているオブジェクトのプロパティのタイプです。ここで面白い部分があります。そのプロパティのセッターには、次のようなコードがあります。

set
{
    _backingField = value;
    _backingField.IsDirtyManager.SetIsDirty();
    NotifyPropertyChanged("MyProperty");
    if (!ContainsType(_backingField.GetType()))
    {
        Aggregates.Add(_backingField);
    }
}

Aggregates.Add をコメントアウトすると、次のプロパティに移動し、そこで同じ例外がスローされます。キッカーは、同じコードで他のプロパティを通過してから、これにヒットして死ぬので、何がわからないのですか?問題が発生する可能性があります。

プロパティ名とタイプが例外に入力されていないため、実際のエラーが発生した経験は誰にでもあるため、エラーは別のものでなければならないようです。クライアントで新しいインスタンスを作成するだけなら、問題なくデシリアライズおよびシリアライズできます。何を探すべきかについてのアイデアはありますか?

編集

私は文字通りこれだけをやっています:

  1. インスタンスを作成
  2. シリアライズ
  3. 逆シリアル化
  4. 再シリアル化
    1. ここで死ぬ
4

3 に答える 3

1

「集合体」はクラスのリストであると想定しています。

クラス コンストラクターが Aggregates リストを作成しない場合、項目を追加しようとすると null になります。

これは、発生しているエラーと一致しませんが、確認する価値があります。

編集

Visual Studio で、[ツール] -> [オプション] -> [デバッグ] -> [全般] に移動し、[マイ コードのみを有効にする] オプションのチェックを外します。その後、再度実行すると、より適切なエラー メッセージが表示される場合があります。

于 2009-11-13T20:15:10.363 に答える
1

わかりました。最後の開発者は、DataMember 属性に Order プロパティを設定しました。問題の原因となったのは、エラー メッセージ内のプロパティより前の順序のプロパティでした。そのクラスで見逃した読み取り専用プロパティがいくつかありました。

于 2009-11-17T14:22:53.330 に答える