2017-01-31 9 views
1

私はこれに背景がprevious question of mineで見つけることができます...SerializationException WCFサービスからカスタムクラスを返すとき

public abstract class Fallible<T> { 
} 

public class Success<T> : Fallible<T> { 
    public Success(T value) { 
    Value = value; 
    } 

    public T Value { get; private set; } 
} 

次のクラスを持っていますが、あなたにその記事を読む必要はありません上記のクラスは、問題を見るために必要なすべてです。その後、

私はこのような単純化WCFサービスの呼び出しを使用している場合...

[OperationContract] 
public Fallible<Patient> GetPatient(int id) { 
    return new Success<Patient>(new Patient {ID = 1,FirstName = "Jim",Surname = "Spriggs"}); 
} 

...私はそれを消費WPFアプリ(またはWCFテストクライアント)からサービスを呼び出そうと、 CommunicationException例外を取得します...

パラメータ:GetPatientResultをシリアル化しようとしているときにエラーが発生しました。 InnerExceptionメッセージが「タイプ」PhysioDiary.Entities.FallibleClasses.Success`1でした[[PhysioDiary.Entities.Patient、 PhysioDiary.Entities、Version = 1.0.0.0、Culture =ニュートラル、PublicKeyToken = null]] ' データ契約あり名前> 'SuccessOfPatient0yGilFAm:http://schemas.datacontract.org/2004/07/PhysioDiary.Entities.FallibleClasses' は必要ありません。 DataContractSerializerを使用している場合、または既知の型の一覧に静的に知られていない型を追加する場合は、たとえば、KnownTypeAttribute属性を使用するか、または をシリアライザに渡される既知の型のリストに追加します。 。詳細については、 を参照してください。InnerExceptionを参照してください。 ...

タイプ「PhysioDiary.Entities.FallibleClasses.Success`1 [[PhysioDiary.Entities.Patient、 PhysioDiary.Entities、バージョン=の内部SerializationException例外

... 「SuccessOfPatient0yGilFAm:http://schemas.datacontract.org/2004/07/PhysioDiary.Entities.FallibleClasses」 のデータ契約名を持つ が含まれています。 DataContractSerializerを使用している場合、またはKnockTypeAttribute属性 を使用して、またはシリアライザに渡される既知の型のリストに追加するなど、既知の型のリスト を静的に静的に追加する場合は、DataContractResolverの使用を検討してください。

私は、各プロパティにクラスに[DataContract][DataMember]を追加するだけでなく、関係するすべての4つのクラスのための[KnownType]属性を追加し、サービス契約でそれらのそれぞれのため[ServiceKnownType]を追加しようとしましたが、何も助けません。

私は同じ質問に無数の答えを読んだが、何も動作していない。私のサービスは他のカスタムクラスを返しますが、それらはすべて問題なくシリアル化されます。

ここで問題が何であるか説明できる人はいますか?十分な情報を提供していない場合は、私にお知らせください。

答えて

0

すべての4つの属性を追加する必要がありますする痛みですが

[OperationContract] 
[ServiceKnownType(typeof(Fallible<Patient>)] 
[ServiceKnownType(typeof(Success<Patient>)] 
[ServiceKnownType(typeof(BadIdea<Patient>)] 
[ServiceKnownType(typeof(Failure<Patient>)] 
public Fallible<Patient> GetPatient(int id) { 
    return new Success<Patient>(new Patient {ID = 1,FirstName = "Jim",Surname = "Spriggs"}); 
} 

...私が行うために必要なすべてが[ServiceKnownType]基本型の属性、および各派生型でのサービスメソッドを飾るだっ判明コール、それは動作します。私は1つの属性にそれらを組み合わせる方法があるかどうかを知りたいですが、少なくとも今は働いているサービスがあります。

これは誰かを助けることを望みます。

関連する問題