2009-03-16 22 views
0

私は今、2つのクラスが実装しているインターフェイスを持っています。これらのクラスのデータはxmlファイルから読み込まれます。インターフェイスを使用したXmlSerialisationの戦略

[Serializable] 
public interface IMyInterface { } 

[Serializable] 
public class MyClass1 : IMyInterface { } 

[Serializable] 
public class MyClass2 : IMyInterface { } 

私はXMLから型を推測したいと思いますが、その方法はありますか?私は直接オブジェクトにXMLからシリアライズすることができるようにしたい

<meta type="MyClass1"> 
    <!--- Some meta data --> 
</meta> 

だから例えば私のXMLは次のようになります。現在、私は手動でxmlを処理しています。

編集:明確にするために、私はシリアライズする方法を知っていますが、どのタイプが最初であるか知らなくても、シリアル化することはできません。私は型の属性を読み、それに基づいてシリアル化する必要がありますか?

答えて

1

を返すクラスにパブリックプロパティを置く場合XmlSerializerを使用すると、XmlIncludeAttributeを追加して、逆シリアル化できる派生クラスを指定できます。しかし、事は、あなたがベースクラスに追加しなければならないということです。

[XmlInclude(typeof(DerivedClass))] 
public abstract class BaseClass 
{ 
    public abstract bool Property { get; set; } 
} 

public class DerivedClass : BaseClass 
{ 
    public override bool Property { get; set; } 
} 

その他の方法に基づいて、派生クラスのための工場を導くことができるメンバーのIXmlSerializableを実装して、持っていることであろう属性(または今現在行っていること)

+0

これは私が今やっていることです。私は基本クラスに切り替えることを検討します。それはとにかく意味をとすかもしれません。ありがとう。 –

-1

これは助けることができる場合、私は知らないが、ここではそれが行く...

何あなたが使用している場合は型名

[XmlAttribute] 
public string Type { 
    get { return GetType().Name; } 
} 
1

XMLシリアライザは、このような状況には適していません。これは、XMLスキーマで記述されたXMLにマップできるオブジェクトを直列化するためのものです。

一方、実行時シリアル化には、.NETタイプの詳細を含むオブジェクトをシリアル化できるSOAPフォーマッタが含まれています。 WCFのNetDataContractSerializerも同様です。

1

私が正しくあなたのクエリを理解していれば...

はあなたのインターフェイスでプロパティを持って、

[Serializable] 
public interface IMyInterface 
{ 
YourClassDifferentiatorEnum ObjectDifferentiator { get; set; } 
} 

そして、各クラスは個別の列挙型の値で、この値を設定してみましょうと言います。これらの具体的なクラスをXMLにシリアル化します。

逆シリアル化(具体的なオブジェクトに戻すXML)を行う場合は、逆シリアル化してIMyInterfaceにデシリアライズし、オブジェクトの差別化要因をチェックし、それに応じてキャストします。

関連する問題