如何使用.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>
最好的方法是什么?
我想我必须创建一个中间类来序列化。选择呢?
你是说这样吗?
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)。