2011-09-12 7 views
1

私はクラスをWCFを通過させようとしています。これらは直列化されていない抽象クラス以外の問題はありません。 これを避ける方法はありますか?WCFを介した抽象クラスのプロパティのシリアル化に関する問題

[DataContract] 
[KnownType("GetKnownTypes")] 
public class BusinessObject 
{ 
    public static Type[] GetKnownTypes() 
    { 
     // only returns the different types my "Field" abstract class can take 
     return Services.WCFRIAKnownTypesHelperService.FieldsKnownTypes.ToArray(); 
    } 

    [DataMember] 
    public String ID { get; set; } 
    [DataMember] 
    public List<Section> Sections { get; set; } 
    [DataMember] 
    public List<Field> Fields { get; set; } 
} 

そして今、私のフィールドクラス

[DataContract] 
public abstract class Field 
{ 
    [DataMember] 
    public String FieldID { get; set; } 
    [DataMember] 
    public String Title { get; set; } 
    [DataMember] 
    public Object Content { get;set; } 
} 

それが動作しないのはなぜ?

答えて

3

[KnownType]属性は、コンパイル時に知らなければならない静的な型が渡されることを想定しています

[DataContract] 
[KnownType(typeof(SomeChildOfBusinessObject))] 
[KnownType(typeof(SomeOtherChildOfBusinessObject))] 
public class BusinessObject 
{ 
    ... 
} 

あなたがダイナミック知られているタイプを登録したい場合は、following blog postを見てみましょうことがあります。

+0

私の問題は、フィールドクラスではなく、うっかりエリアアされているBusinessObjectです。 – Nicolas

+0

@Nicolas、あ、すみません。この場合、すべての可能な子オブジェクトを指定することによって、 'Field'クラスを' KnownType'属性で飾る必要があります。 –

0

knowntypeに継承されていても、未知の型をクライアントに移送することはできません。 ur型を基底クラスにキャストすると、オブジェクトはまだ子クラスに残っているため、移送または直列化できません。 refecltionを使用して、既知の型として動的型を登録できますが、これは動的型を逆直列化する際の問題です。

+0

さて、わかりました。 私はRIAサービスを使っているので、 "共有コンテキスト"を使ってそれを行う方法はありますか? – Nicolas

+0

こちらを参照してください。http://stackoverflow.com/questions/4495887/datacontract-serialize-abstract-class – hungryMind

関連する問題