C# 如何使用.NET XML序列化将对象序列化为单个值

C# 如何使用.NET XML序列化将对象序列化为单个值,c#,xml,serialization,C#,Xml,Serialization,假设我具备以下条件: [Serializable] public class Foo { public Bar bar { get; set; } public Ram ram { get; set; } } [Serializable] public class Bar { [XmlElement("barId")] public int Id {

假设我具备以下条件:

[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>

123
234
最好的方法是什么


我想我必须创建一个中介类来序列化。备选方案?

使用XmlSerializer。这个问题与您的问题类似,有一些有用的答案:

使用XmlSerializer。这个问题与您的问题类似,并且有一些有用的答案:

我想您可以这样做:

[Serializable]
public class Foo
{
private Bar _bar;

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

             _bar.Id = id;
       }
    }

}

虽然我觉得我应该补充一点,这听起来有点误导。。。你为什么要这样做?

我想你可以这样做:

[Serializable]
public class Foo
{
private Bar _bar;

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

             _bar.Id = id;
       }
    }

}

虽然我觉得我应该补充一点,这听起来有点误导。。。为什么要这样做?

用属性标记Bar和Ram以防止序列化,添加公开Id的公共属性,如果Bar为null,则使用BARD的get返回null,否则使用Bar.Id。让集合按id加载现有条或创建新条(根据您的BL)。Ram也是如此。

用属性标记Bar和Ram以防止序列化,添加公开Id的公共属性,如果Bar为null,则使用BARD的get返回null,Bar.Id elsewise。让集合按id加载现有条或创建新条(根据您的BL)。Ram也是这样。

你是说像这样

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;
    }

  }

}
你是说像这样

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-可能值得将答案的关键点(即
XmlTextAttribute
)从大屏幕滚动区域中移出来。+1-这很有效,但解释一下为什么会有用。+1-可能值得将答案的关键点(即
XmlTextAttribute
)从大屏幕滚动区域中移出来。+1-这很有效,但是解释一下为什么会有帮助。