2010-11-16 6 views
8

J'ai essayé d'utiliser XmlSerializer, mais XmlSerializer ne sérialisera pas une valeur TimeSpan; il génère juste un tag vide pour les timespans (sinon aurait été parfait). Alors j'ai essayé d'utiliser SoapFormatter, mais SoapFormatter ne sérialisera pas les listes génériques; cela entraîne juste une exception.Comment sérialiser un objet avec TimeSpan et des listes génériques en XML en C#?

Quelles autres options ai-je? Je ne peux pas modifier la classe de l'objet que je sérialise car il est généré à partir d'une référence de service. Donc, toutes les solutions de contournement qui impliquent de changer la classe sont sortis. Est-ce que je n'ai pas d'autre choix que d'implémenter un sérialiseur personnalisé? Y a-t-il des outils externes que je pourrais utiliser?

Répondre

6

Vous pouvez utiliser 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); 

Résultat:

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