おそらくこの質問の複製
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
。これもうまくいきません。