2012-05-04 2 views
0

Мой вопрос настолько прост.Использование IXmlSerialization, как я могу сериализовать свойство T?

Представьте, что у нас есть класс Foo. и имеет свойство T.

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

Я хочу осуществить в нем IXmlSerializable и моя проблема, я понятия не имею, чтобы имитировать стандартный XmlSerialization. Я действительно не знаю, как написать это свойство, как стандартная XmlSerlalization.

UPDATE: Я сделал это, и это не работает

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>> { } 

Когда я сериализовать эти классы (A, B и C). Я хочу иметь что-то вроде этого:

Использование первого класса:

<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

Вы должны реализовать IXmlSerializable в Foo<T> и Т (с использованием where T : IXmlSerializable. Реализация в Foo<T> будет нести ответственность за написание элемента обертки с информацией о типе (в WriteXml) и вызвать WriteXml на Т, и воссоздать экземпляр из информация о типе (в ReadXml) и вызвать ReadXml на Т.

Основные типы, как String и Double не IXmlSerializable, так что вы не можете иметь where T : IXmlSerializable, если вы хотите, чтобы поддержать их. Кроме того, можно обеспечить реализацию по умолчанию из ReadXml и WriteXml. Это работает, так как вам нужно создать Foo<T> перед вызовом ReadXml, заставляя вас знать 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

Спасибо за ваш ответ Саймона, смотрите мой инфо обновление –

+0

@DarfZon: Я обновил свой ответ. – sisve