2012-04-16 58 views
3

我想序列化幾個對象列表到XML。這些列表是不同類型的,但它們都需要在頂部列表對象上具有一些相同的屬性。在C#中列表的通用序列化

我想獲得是頂層的「計數」和對象的列表中的所有項目名稱:

<JobResult Count="2"> 
     <Job> 
      <Id>1</Id> 
     </Job> 
     <Job> 
      <Id>2</Id> 
     </Job> 
    </JobResult> 

然後再列表:

<PersonResult Count="1"> 
     <Person> 
      <Id>1</Id> 
     </Person> 
</PersonResult> 

我使用的代碼是:

[XmlRoot()] 
    public class Result<T> 
    { 
     [XmlElement()] 
     public List<T> Items { get; set; } 

     public Result() 
     { 
      this.Items = new List<T>(); 
     } 

     [XmlAttribute("Count")] 
     public int ItemCount 
     { 
      get 
      { 
       return this.Items.Count; 
      } 
      set 
      { 

      } 
     } 
    } 
var jobs= new Result<Job>(); 
var persons= new Result<Person>(); 

我所得到的是:

<ResultOfJob Count="2"> 
     <Item> 
      <Id>1</Id> 
     </Item> 
     <Item> 
      <Id>2</Id> 
     </Item> 
    </ResultOfJob > 

我試過這樣的屬性命名,但得到< _x007B_0_x007D_>而不是項目。

[XmlElement({0})] 
public List<T> Items { get; set; } 

什麼是最好的方式來處理動態命名的項目?

回答

3

我最終解決這以類似的方式產生的結果類方式:

public abstract class Result<T> 
{ 
    [XmlIgnore] 
    public abstract List<T> Items {get;set;} 

    [XmlAttribute] 
    public int ResultCount 
    { 
     get 
     { 
      return this.Items.Count; 
     } 
     set { } 
    } 


    public Result() 
    { 
     this.Items = new List<T>(); 
    } 

而且那麼我繼承這個類的任何對象,我需要有共同的ResultCount作爲屬性。如果我需要爲所有結果對象添加其他常用屬性,我可以通過上面的Result類來完成。

下面是一個例子繼承的類:

public class ChallengesResult : Result<ChallengeResource> 
{ 
    public ChallengesResult() 
     : base() 
    { 
    } 


    [XmlElement("Challenge")] 
    public override List<ChallengeResource> Items { get; set; } 
} 

的[XmlIgnore]上的結果類的列表允許我指定用[的XmlElement]屬性派生類中的列表項的名稱。

0

這裏是你如何能夠實現它的定義如下

public class Job 
{ 
    [XmlElement] 
    public int Id; 
} 

public class Person 
{ 
    [XmlElement] 
    public int Id; 
} 

以產品JobResult XML格式的工作/人類型,

private static string GetJobResultXml() 
{ 
    var jobs = new Result<Job>(); 
    jobs.Items.Add(new Job() { Id = 1 }); 
    jobs.Items.Add(new Job() { Id = 2 }); 

    XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces(); 
    xmlnsEmpty.Add("", ""); 

    XmlWriterSettings xws = new XmlWriterSettings(); 
    xws.OmitXmlDeclaration = true; 
    xws.ConformanceLevel = ConformanceLevel.Auto; 
    xws.Indent = true; 

    XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 
    XmlAttributes attr = new XmlAttributes(); 
    attr.XmlRoot = new XmlRootAttribute("JobResult"); 
    overrides.Add(jobs.GetType(), attr); 

    XmlAttributes attr1 = new XmlAttributes(); 
    attr1.XmlElements.Add(new XmlElementAttribute("Job", typeof(Job))); 
    overrides.Add(jobs.GetType(), "Items", attr1); 

    StringBuilder xmlString = new StringBuilder(); 
    using (XmlWriter xtw = XmlTextWriter.Create(xmlString, xws)) 
    { 
     XmlSerializer serializer = new XmlSerializer(jobs.GetType(), overrides); 
     serializer.Serialize(xtw, jobs, xmlnsEmpty); 

     xtw.Flush(); 
    } 

    return xmlString.ToString(); 
} 

爲了生產PersonResult XML,你將不得不請稍微修改上述方法以獲得如下預期結果

private static string GetPersonResultXml() 
{ 
    var jobs = new Result<Person>(); 
    jobs.Items.Add(new Person() { Id = 1 }); 
    jobs.Items.Add(new Person() { Id = 2 }); 

    XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces(); 
    xmlnsEmpty.Add("", ""); 

    XmlWriterSettings xws = new XmlWriterSettings(); 
    xws.OmitXmlDeclaration = true; 
    xws.ConformanceLevel = ConformanceLevel.Auto; 
    xws.Indent = true; 

    XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 
    XmlAttributes attr = new XmlAttributes(); 
    attr.XmlRoot = new XmlRootAttribute("PersonResult"); 
    overrides.Add(jobs.GetType(), attr); 

    XmlAttributes attr1 = new XmlAttributes(); 
    attr1.XmlElements.Add(new XmlElementAttribute("Person", typeof(Person))); 
    overrides.Add(jobs.GetType(), "Items", attr1); 

    StringBuilder xmlString = new StringBuilder(); 
    using (XmlWriter xtw = XmlTextWriter.Create(xmlString, xws)) 
    { 
     XmlSerializer serializer = new XmlSerializer(jobs.GetType(), overrides); 
     serializer.Serialize(xtw, jobs, xmlnsEmpty); 

     xtw.Flush(); 
    } 

    return xmlString.ToString(); 
} 

我h這有助於。

有關使用XMLATTRIBUTES類的更多信息,請點擊此鏈接

http://msdn.microsoft.com/en-us/library/sx1a4zea(v=vs.80).aspx

+0

這似乎得到所需的結果,但它似乎並沒有動態做到這一點。我將不得不爲每個想要序列化的新對象編寫一個函數。 – jsturtevant 2012-04-23 12:21:34