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

本文关键字:序列化 对象 单个值 net XML 何使用 | 更新日期: 2023-09-27 17:50:42

假设我有以下内容:

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

最好的方法是什么?

我想我必须创建一个中间类来序列化。选择呢?

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

你是说这样吗?

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

使用XmlSerializer。这个问题与您的问题类似,并且有一些有用的答案:使用StringWriter进行XML序列化

我想你可以这样做:

[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,则BarId的get返回null, Bar。另外的Id。让该设置通过id加载现有Bar或创建新Bar(根据您的BL)。