2009-08-11 13 views
9

私は抽象クラスを持っています。それをLifeformと呼ぼう。抽象基本クラスを直列化しないASMX Webサービス

public abstract class Lifeform { 
    public virtual int Legs { get; set; } 
    public virtual int Arms { get; set; } 
    public virtual bool Alive { get; set; } 
} 

(仮想属性が、私は、彼らが仮想プロパティはいないのであればwhinesがNHibernateはを、使用しているという事実によるものである。)

が、私はそれから継承するクラスを持っている:それは何かのように見えますそのLifeformクラスから。私たちは人間と呼ぶでしょう。それは次のようになります。

public class Human: Lifeform { 
    public virtual bool Hat { get; set; } 
    public virtual int Age { get; set; } 
    public virtual string Name { get; set; } 
} 

すべての美しい、私はそれを使用していたとき、私は私のクラスを使用することができ、人間の脚、腕、およびアライブプロパティを取得します。ただし、ヒューマンクラスを使用してWebサービスを作成しようとしたときを除きます。シリアライズされたオブジェクトは、私に帽子、年齢、および名前を与えますが、Legs、Arms、またはAliveプロパティはありません。

私は、基本クラス(生命体)で

[System.Xml.Serialization.XmlInclude(typeof(Human))] 

を使用することを提案している回避策を見てきましたが、それはOOに違反恐ろしいハックのように思えます。ベースクラスのリンクを継承するクラスにリンクを張っていますか? Eww。

以前にこの特定の問題に遭遇した人はいますか?アイデアはありますか?より詳細な例が私が何をしているのかを説明するのに役立つなら、もっとコードを提供します。

+0

私は同じ問題を抱えていました。これが私の解決に役立ちました。私はそれを返すメソッドの代わりに、クラスの属性を設定し終わった。 – Guffa

答えて

8

私が読んだところでは、基本クラスではなくオブジェクトを返すWebメソッドにXMLInclude属性を含めることができます。まだきれいではありませんが、基底クラスに派生クラス名を入れるよりも少し気になるかもしれません。私はそれを試していないが、あなたはこのようなことをすることができると思う。

[WebMethod] 
[XmlInclude(typeof(LifeForm))] 
public Human GetHuman() 
{ 
    return new Human(); 
} 
+0

素晴らしいです、ありがとうございます。最初は動作しませんでしたが、正しいコードを生成するようですが、サンプルには表示されません。私はそれを試し続けていて、私は "一体どんなもの"と思って実際にシリアライズされたオブジェクトを生成するまでは動作していないようです。綺麗な。完璧ではありませんが、ちょっと、それは私の基本クラスを撃つよりも優れています。ありがとう! –

+0

基本クラスをパラメータとして渡してGetHuman関数でHumanにキャストする場合はどうですか?可能? –

+0

多くの種類のリストはどうやったらいいですか? – Stainedart

0

VB.NETでまったく同じ問題に遭遇します。 XMLInclude属性を使用して、醜いながら、トリックでした。

+0

VB.NETで同じ問題が起きるのは驚くことではありません。なぜなら、.NETの問題で、C#の問題ではないからです。 –

関連する問題