2010-11-16 4 views
8

Próbowałem używać XmlSerializer, ale XmlSerializer nie będzie szeregować wartości TimeSpan; po prostu generuje pusty znacznik dla przedziałów czasowych (w przeciwnym razie byłby idealny).Jak serializować obiekt z TimeSpan i listy ogólne do XML w C#?

Tak więc próbowałem używać SoapFormatter, ale SoapFormatter nie będzie serializować ogólnych list; to właśnie powoduje wyjątek.

Jakie mam inne opcje? Nie mogę dokonać żadnych zmian w klasie obiektu, który serializuję, ponieważ jest generowany z odwołania do usługi. Więc wszelkie obejścia, które wymagają zmiany klasy, są obecnie niedostępne.

Czy nie mam innego wyjścia, jak zaimplementować niestandardowy serializator? Czy mogę skorzystać z zewnętrznych narzędzi?

Odpowiedz

6

Można użyć DataContractSerializer


[DataContract] 
public class TestClass 
{ 
    // You can use List<T> or other generic collection 
    [DataMember] 
    public HashSet<int> h { get; set; } 

    [DataMember] 
    public TimeSpan t { get; set; } 

    public TestClass() 
    { 
     h = new HashSet<int>{1,2,3,4}; 
     t = TimeSpan.FromDays(1); 
    } 
} 

var o = new TestClass(); 

ms = new MemoryStream(); 

var sr = new DataContractSerializer(typeof(TestClass)); 
sr.WriteObject(ms, o); 

File.WriteAllBytes("test.xml", ms.ToArray()); 

ms = new MemoryStream(File.ReadAllBytes("test.xml")); 

sr = new DataContractSerializer(typeof(TestClass)); 
var readObject = (TestClass)sr.ReadObject(ms); 

Wynik:

<TestClass xmlns="http://schemas.datacontract.org/2004/07/Serialization" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><h xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><a:int>1</a:int><a:int>2</a:int><a:int>3</a:int><a:int>4</a:int></h><t>P1D</t></TestClass>