2012-05-04 12 views
0

私の質問はとても簡単です。IXmlSerializationを使用して、Tプロパティをシリアル化するにはどうすればよいですか?

Fooクラスがあるとします。 T特性を有する。

public class Foo<T> 
{ 
    public T Property { get; set; } 
} 

私はそれに実装するIXmlSerializableと私の問題は、私は、標準XmlSerializationを模倣する見当がつかないです。私は本当にstandart XmlSerlalizationのようにこのプロパティを書く方法については考えていません。

UPDATE:私はこれをしなかったし、私はこのクラス(A、BおよびC)をシリアライズするとき、それは

public class Foo<T> : IFoo 
    where T : IXmlSerializable 
{ 
    public T Value { get; set; } 
} 

public class FooA : Foo<string> { } 
public class FooB : Foo<int> { } 
public class FooC : Foo<List<Double>> { } 

を働いていません。最初のクラスを使用して

<FooA> 
    <Value>StringDemo</Value> 
</FooA> 

番目のクラスを使用する:

<FooB> 
    <Value>2</Value> 
</FooB> 

を第三のクラスを使用する:このような

<FooC> 
    <Value> 
     <ArrayOfDouble xsi:..> 
      <Double>3.1416</Double> 
      <Double>4.2</Double> 
     </ArrayOfDouble> 
    </Value> 
</FooC> 

何かが何私である私は、このようなものを持っていたいです私はこのすべてのカスタムXmlSerializerを実装したくない、私は標準の標準を意味するシリアライズの使用。

答えて

1

あなたはFoo<T>IXmlSerializableを実装する必要があり、そしてT(where T : IXmlSerializableを使用します。Foo<T>における実装は、その後WriteXmlで(種別情報とラッパー要素を記述するための責任がある)とTにWriteXmlを呼び出し、そしてからインスタンスを再作成するでしょう(ReadXml中)型情報とStringDoubleなどのReadXml

T.に関する基本型を呼び出すあなたがそれらをサポートしたい場合は、 where T : IXmlSerializableを持って傾けるので、 IXmlSerializableではありません。あなたはまた、 ReadXmlとのデフォルトの実装を提供することができます。 ReadXmlを呼び出す前に Foo<T>を作成して、 Tを知っておく必要があるため、これが機能します。

public class Foo<T> : IXmlSerializable { 
    public T Value { get; set; } 

    XmlSchema IXmlSerializable.GetSchema() { 
     return GetSchema(); 
    } 

    protected virtual XmlSchema GetSchema() { 
     return null; 
    } 

    public virtual void ReadXml(XmlReader reader) { 
     reader.ReadStartElement(); 
     var xmlSerializer = new XmlSerializer(typeof(T)); 
     Value = (T)xmlSerializer.Deserialize(reader); 
     reader.ReadEndElement(); 
    } 

    public virtual void WriteXml(XmlWriter writer) { 
     var xmlSerializer = new XmlSerializer(typeof(T)); 
     xmlSerializer.Serialize(writer, Value); 
    } 
} 
+0

Simonさん、ありがとうございました。私の更新情報をご覧ください。 –

+0

@DarfZon:私は自分の答えを更新しました。 – sisve

関連する問題