2012-02-12 21 views
6

Özet Nesneleri sınıf nesnesinin serileştirilmesiyle ilgili iyi örnekler. Soyut olmayan temel sınıfı olan örnekler, XML Serialize generic list of serializable objects'da listelenmiştir. Benim taban sınıfı Microsoft.Build.Utilities.TaskXML Özet Taban sınıfıyla seri hale getirilebilir nesnelerin genel listesini seri hale getirin.

+0

@Dmitry ile katılıyorum. Alternatif cevap bunun yerine XmlArrayItemAttribute kullanabilirsiniz Hayvanlar elemanı tutmak için wan't XmlInclude http://stackoverflow.com/questions/370291/serializing-without-xmlinclude – walter

cevap

4

kesinlikle yazılı listeler ve bu tür kullanımına izin vermek için birkaç türetilmiş türleri ile soyut sınıfları genelde yararlıdır benzer.

Örneğin soyut ve DocumentFragment sınıfı olabilir TextDocumentFragment ve CommentDocumentFragment (Willis bu örnek) olarak adlandırılan iki beton sınıfları.

Bu, yalnızca bu iki türden nesneyi içerebilen bir Liste özelliğinin oluşturulmasına izin verir.

Eğer bir hata alıyorum bu listeyi döndüren bir WebService oluşturma girişiminde ama bu aşağıda kodu ile etrafında almak kolay ise ....

[Serializable()] 
[System.Xml.Serialization.XmlInclude(typeof(TextDocumentFragment))] 
[System.Xml.Serialization.XmlInclude(typeof(CommentDocumentFragment))] 
public abstract class DocumentFragment { 
...} 

XmlInclude nitelikler

o olabilir sınıfını anlatmak Bu iki türetilmiş sınıflara serileştirilmelidir.

Bu aşağıdaki gibi, gerçek türü belirten DocumentFragment öğesinde bir özellik oluşturmaktadır. türetilmiş sınıfına karşı spesifik

<DocumentFragment xsi:type="TextDocumentFragment"> 

herhangi additonal özellikleri de bu yöntem kullanılarak dahil edilir.

11

diğer alternatif çirkin olmadan (... jenerik listesinin kendisine bilinen türlerinin listesini taşımak için XmlElementAttribute kullanmak da daha iyi görünümlü bir XML çıktısı ile sonuçlanacaktır

using System; 
using System.Xml; 
using System.Xml.Serialization; 
using System.Collections.Generic; 

public abstract class Animal 
{ 
    public int Weight { get; set; }  
} 

public class Cat : Animal 
{ 
    public int FurLength { get; set; }  
} 

public class Fish : Animal 
{ 
    public int ScalesCount { get; set; }  
} 

public class AnimalFarm 
{ 
    [XmlElement(typeof(Cat))] 
    [XmlElement(typeof(Fish))] 
    public List<Animal> Animals { get; set; } 

    public AnimalFarm() 
    { 
     Animals = new List<Animal>(); 
    } 
} 

public class Program 
{ 
    public static void Main() 
    { 
     AnimalFarm animalFarm = new AnimalFarm(); 
     animalFarm.Animals.Add(new Cat() { Weight = 4000, FurLength = 3 }); 
     animalFarm.Animals.Add(new Fish() { Weight = 200, ScalesCount = 99 }); 
     XmlSerializer serializer = new XmlSerializer(typeof(AnimalFarm)); 
     serializer.Serialize(Console.Out, animalFarm); 
    } 
} 

... olduğunu xsi:type özniteliği) ...

<?xml version="1.0" encoding="ibm850"?> 
<AnimalFarm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Cat> 
    <Weight>4000</Weight> 
    <FurLength>3</FurLength> 
    </Cat> 
    <Fish> 
    <Weight>200</Weight> 
    <ScalesCount>99</ScalesCount> 
    </Fish> 
</AnimalFarm> 
+0

olmadan Dizgeleştirme bulunabilir. – Console

İlgili konular