2011-04-19 61 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一样。