2011-04-19 53 views
1

假設我有以下幾點:如何使用.NET XML序列化序列化對象爲單個值

[Serializable] 
public class Foo 
{ 
    public Bar bar 
    { 
     get; 
     set; 
    } 

    public Ram ram 
    { 
     get; 
     set; 
    } 
} 

[Serializable] 
public class Bar 
{ 
    [XmlElement("barId")] 
    public int Id 
    { 
     get; 
     set; 
    } 
} 

[Serializable] 
public class Ram 
{ 
    [XmlElement("ramId")] 
    public int RamId 
    { 
     get; 
     set; 
    } 
} 

我想序列化爲XML爲:

<Foo> 
    <barId>123</barId> 
    <ramId>234</ramId> 
</Foo> 

什麼最好的方法來做到這一點?我想我將不得不創建一箇中間類來序列化。備擇方案?

回答

8

您的意思是這樣的?

using System.Text; 
using System.Xml; 
using System.Xml.Serialization ; 

namespace ConsoleApplication11 
{ 

    [XmlRoot("Foo")] 
    public class Foo 
    { 
    public Foo() 
    { 
     bar = new Bar() ; 
     ram = new Ram() ; 
    } 

    [XmlElement("barId")] 
    public Bar bar { get; set; } 

    [XmlElement("ramId")] 
    public Ram ram { get; set; } 

    } 

    public class Bar 
    { 
    [XmlText] 
    public int Id { get; set; } 
    } 

    public class Ram 
    { 
    [XmlText] 
    public int RamId { get; set; } 
    } 

    class Program 
    { 

    static int Main(string[] argv) 
    { 
     XmlSerializer xml = new XmlSerializer(typeof(Foo)) ; 
     XmlWriterSettings settings = new XmlWriterSettings() ; 

     settings.Indent = true ; 
     settings.IndentChars = " " ; 
     settings.Encoding = new UnicodeEncoding(false , false) ; // little-endian, omit byte order mark 
     settings.OmitXmlDeclaration = true ; 

     Foo instance = new Foo() ; 
     instance.bar.Id = 1234 ; 
     instance.ram.RamId = 9876 ; 

     StringBuilder sb = new StringBuilder() ; 
     using (XmlWriter writer = XmlWriter.Create(sb , settings)) 
     { 
     xml.Serialize(writer, instance) ; 
     } 
     string xmlDoc = sb.ToString() ; 

     Console.WriteLine(xmlDoc) ; 

     return 0; 
    } 

    } 

} 
+1

+1 - 將您的答案('XmlTextAttribute')的癥結從大量滾動區域移出可能是值得的。 – 2011-04-20 00:15:01

+0

+1 - 這有效,但爲什麼會有所幫助的一些解釋。 – Odrade 2011-04-20 00:19:19

+0

我的意思就是這樣! – Armbrat 2011-04-20 00:27:34

0

我想你可以做這樣的事情:

[Serializable] 
public class Foo 
{ 
private Bar _bar; 

    public int BarID 
    { 
     get { return _bar.Id;} 
     set 
     { 
      if (_bar==null) _bar= new Bar(); 

      _bar.Id = id; 
     } 
    } 

} 

雖然我覺得我應該補充一點,這聽起來有點誤導......爲什麼會你想這樣做?

0

標記欄和Ram具有防止序列化的屬性,添加暴露ID的公共屬性代替BarId,如果Bar爲null,則返回null,否則爲Bar.Id。讓該集合通過id加載現有的Bar或創建一個新的(根據您的BL)。 Ram一樣。