おそらくこの質問の複製
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行ったことを示しますKnownTypes。personnelClassPropertyこれは型も保持することに注意してください。オブジェクトに対してもこれを行いました。これは、PersonPropertyオブジェクトを保持する実際のクラスですPersonnelClassPropertyが、 のリストpersonPropertiesが使用されているためですPerson。これもうまくいきません。