2009-12-01 8 views
6

基本クラスにメソッドのみを追加する派生クラスがあります。派生クラスを直列化して、それが基本クラスの直列化と一致するようにするにはどうすればよいですか? すなわち、派生クラスの直列化されたXMLは次のようになります。派生クラスを基底クラスとして直列化する方法

<BaseClass> 
    ... 
</BaseClass> 

例えば 以下はInvalidOperationExceptionをスローします "型DerivedClassが期待されていませんでした。静的に知られていない型を指定するには、XmlIncludeまたはSoapInclude属性を使用してください。

Class BaseClass {} 

Class DerivedClass : BaseClass {} 

DerivedClass derived = new DerivedClass(); 

StreamWriter stream = new StreamWriter("output file path"); 
XmlSerializer serializer = new XmlSerializer(GetType(BaseClass)); 
serializer(stream, derived); 

答えて

4

シリアライズのコンストラクタにGetType(DerivedClass)を渡す必要があります。シリアライズするオブジェクトの型と一致する必要があります。 <XmlRoot>属性を使用して、ルート要素の名前を変更することができます。私はあなたには、いくつかのより多くのコードを必要とし、あなたのベースクラスのためのIXmlSerializableを実装し、仮想など、すべてのインターフェイスのメソッドを宣言し、それらを上書きするだろうと言うことができる);グーグルの少し後

using System; 
using System.Xml.Serialization; 
using System.IO; 

class Program { 
    static void Main(string[] args) { 
    var obj = new DerivedClass(); 
    obj.Prop = 42; 
    var xs = new XmlSerializer(typeof(DerivedClass)); 
    var sw = new StringWriter(); 
    xs.Serialize(sw, obj); 
    Console.WriteLine(sw.ToString()); 

    var sr = new StringReader(sw.ToString()); 
    var obj2 = (BaseClass)xs.Deserialize(sr); 
    Console.ReadLine(); 
    } 
} 

public class BaseClass { 
    public int Prop { get; set; } 
} 
[XmlRoot("BaseClass")] 
public class DerivedClass : BaseClass { } 
+0

、ありがとう、ありがとう。 –

+0

皆さん、私はここで同じ問題を抱えていますが、これはうまくいきませんでした。私の基本クラスはXSDから作成されたので、私は[XmlRoot]に何を入れるのかわかりません は、クラスの名前、または基本クラスのルート要素の名前です(名前空間を指定する必要があります。等)? – Tejo

+1

派生型ではなく、基底のみが分かっていれば解はありますか? –

0

私は試していませんが、キャストできませんか?

serializer(stream, (BaseClass)derived); 

編集

あなたは複数の派生クラス&基底クラスに対応できる単一XmlSerialiserを持つようにしたい場合はまた、あなたはXmlSerialiserコンストラクタでタイプのすべてを指定する必要があります。

XmlSerializer serializer = new XmlSerializer(typeof(BaseClass), new Type[] {typeof(DerivedClass)}); 

次に、複数のタイプをうれしくシリアル化します。しかし、出力XMLをクラス間で一致させるには、上記のソリューションを使用する必要があります。

+1

同じInvalidOperationExceptionがスローされません –

0

:このサンプルコードは、意図したとおりに働いていましたあなたの派生クラスで。上記のインタフェースで解決されたサンプルtopicsimilar problemがあります。

1

また、BaseClassのためICloneableインターフェイスを実装してから行うことができます。

var sw = new StringWriter() 

var base = (derived as BaseClass).Clone() 
var serializer = new XmlSerializer(typeof(BaseClass)) 
serializer.Serialize(sw, base) 

Console.WriteLine(sw.ToString()) 

ない完璧approcheが、あなたのベースクラスがシンプルであれば、それも動作するはずです。

関連する問題