2010-11-16 16 views
8

XmlSerializer kullanmayı denedim, ancak XmlSerializer bir TimeSpan değerini serileştirmeyecek; sadece zaman çizelgeleri için boş bir etiket oluşturur (aksi halde mükemmel olurdu).Bir nesneyi TimeSpan ve Genel Listeleri olan XML'de C# ile seri hale getirebilir miyim?

Yani SoapFormatter kullanmayı denedim, ancak SoapFormatter genel listeleri serileştirmeyecek; Bu sadece bir istisna ile sonuçlanır.

Başka hangi seçeneklerim var? Hizmet referansından oluşturulduğu için serileştirdiğim nesnenin sınıfında herhangi bir değişiklik yapamıyorum. Yani sınıfı değiştirmeyi içeren herhangi bir geçici çözüm var.

Özel bir seri hale getirici uygulamaktan başka çarem yok mu? Kullanabileceğim harici araçlar var mı?

cevap

6

kullanabilirsiniz 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); 

Sonuç:

<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> 
İlgili konular