1

おそらくこの質問の複製

DataSerializerで使用される標準を使用して、一連のオブジェクトをシリアル化しようとしていwcfます。

オブジェクト構造:

[KnownType(typeof(PersonnelClassProperty))]
[KnownType(typeof(ResourceClassProperty))]
[KnownType(typeof(Person))]
[KnownType(typeof(PersonProperty))]
[KnownType(typeof(ResourceDefinitionProperty))]
[DataContract]
public class Person: ResourceDefinition
{
   [DataMember]
   public guid id {get; set;}

   [DataMember]
   public IList<PersonProperty> personProperties {get; set;}

   [DataMember]
   public IList<PersonnelClass> personnelClasses {get; set;}
}

PersonProperty : ResourceDefinitionProperty

  • 人事クラス プロパティ

PersonnelClass : リソースクラス

  • 人事クラス プロパティ

PersonnelClassPoperty : ResourceClassProperty

上記の構造は、 を使用してマップされNhibernateます。そのため、基本クラスにはabstract classes、メイン クラスにオーバーライドする基本プロパティがあります。で CRUD 関数を呼び出すためのジェネリック クラスを使用できるように、これを使用していNhibernateます。

これがもたらす最初の問題は循環参照であり、これを修正しました。オブジェクトのリストをリセットすることで、循環参照の問題を解消しました。

また、プロパティと関連するクラス プロパティをループして取得します。nHibernate

これにより、いくつかのテストデータを生成できました。を持つものpersonnelclassがありpersonnelclasspropertyます。これらはそれ自体で正常に取得されています。次に がありpersonます。personnelclass、およびへの参照を追加しましたpersonnelclassproperty。データベースには、personnelclassこの a のように、 person と の間のリンクの参照を保持する追加のテーブルがありmany-to-many relationShipます。thepersonPropertyには単一の への参照があるpersonnelClasspropertyため、ここでは aFKで十分です。

ここで、2 番目の問題に遭遇します。シリアライゼーション例外が発生します。

データ コントラクト名が「PersonnelClassPropertyProxy: http://schemas.datacontract.org/2004/07/」の「PersonnelClassPropertyProxy」は想定されていません。DataContractResolver の使用を検討するか、既知の型のリストに静的に認識されていない型を追加します。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加します。

そのため、最初の行で述べた質問から、上記のクラスに[DataContract],[DataMember]および属性を追加しました。もちろん正しいタイプは[KnownType(typeof(T))]どこですか。T

wcf を介して人物オブジェクトを受信側に送信するpersonPropertyと、 が と の間にリンクがない場合は問題なく動作しますが、 へのリンクをpersonnelClassProperty含む を追加するpersonpropertyと、PersonnelClassProperty上記の例外が発生します。

オンラインで見るすべての例と質問は同じように機能します

具体的に; 私は何を間違っていますか?または私はここで何を忘れていますか?

私たちが使用するオブジェクトを説明するために、より多くのコードで質問を更新しようとします。

編集:オブジェクトの構造を更新して、 でPerson行ったことを示しますKnownTypespersonnelClassPropertyこれは型も保持することに注意してください。オブジェクトに対してもこれを行いました。これは、PersonPropertyオブジェクトを保持する実際のクラスですPersonnelClassPropertyが、 のリストpersonPropertiesが使用されているためですPerson。これもうまくいきません。

4

1 に答える 1

1

私は解決策を見つけました。を使用しているためNHibernatelazy loadingpersonnelClassProperty入り、Personproperty最終的に に入りますPerson。これは になりserialization exceptionます。

例外を解決するには、実際には 2 つの解決策があります。

1:オブジェクトを NHibernate にマッピングするNot.LazyLoad()代わりに、プロパティを設定できます。LazyLoad()

2:Lazyload()プロパティを有効のままにして、代わりにオブジェクトから項目を取得し、シリアル化を試みる前に何かを行うことができます。次のように新しい変数を作成するだけでは不十分です。

PersonnelClassProperty classproperty = personProperty.PersonnelClassProperty;

次のように、内部オブジェクトで何かをする必要があります。

PersonnelClassProperty classProperty = personProperty.PersonnelClassProperty;
System.Diagnostics.Debug.WriteLine(classproperty.Dbid);

現在、.Not.Lazyload()オプションを使用することを選択しました

于 2013-04-11T12:36:22.703 に答える