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-这很有效,但是解释一下为什么会有帮助。