简单的C#Xml序列化
我有一门课:简单的C#Xml序列化,c#,.net,xml,xml-serialization,c#-4.0,C#,.net,Xml,Xml Serialization,C# 4.0,我有一门课: public class Car { public string Model {get;set;} public string SeatFinish {get;set;} public string Audio {get;set;} } 我想使用XML序列化属性将其序列化为以下XML <Car> <Model>name</Model> <Options> <SeatFinish>Le
public class Car {
public string Model {get;set;}
public string SeatFinish {get;set;}
public string Audio {get;set;}
}
我想使用XML序列化属性将其序列化为以下XML
<Car>
<Model>name</Model>
<Options>
<SeatFinish>Leather</SeatFinish>
<Audio>5 speaker</Audio>
</Options>
</Car>
这是域模型的一部分还是类似的?听起来您希望这些选项在car对象之外可以重用,那么为什么不创建一个单独的options类呢
public class Options
{
public string SeatFinish {get;set;}
public string Audio {get;set;}
}
并将您的汽车
类别更改为持有选项
类别:
public class Car
{
public string Model {get;set;}
public Options Options {get;set;}
}
如果可能,请尝试将类更改为:
public class Car {
public class CarOptions
{
public string SeatFinish { get; set; }
public string Audio { get; set; }
}
public string Model { get; set; }
public CarOptions Options { get; set; }
public Car()
{
this.Options = new CarOptions();
}
}
我相信要得到您想要的,您需要实现IXmlSerializable并自己序列化对象 请参阅: 首先实现接口:
public class Car : IXmlSerializable
{
// Private state
public string Model { get; set; }
public string SeatFinish { get; set; }
public string Audio { get; set; }
public Car()
{
Model = "Toyota";
SeatFinish = "Leather";
Audio = "Awesome Soundz";
}
然后实现自定义序列化。XmlWriter类下有很多方法可以快速、智能地创建XML,但是为了简单起见,我在这里使用了WriteRaw()
public void WriteXml(XmlWriter writer)
{
writer.WriteRaw("<Model>" + this.Model + "</Model>");
writer.WriteRaw("<Options>");
writer.WriteRaw("<SeatFinish>" + this.SeatFinish + "</SeatFinish>");
writer.WriteRaw("<Audio>" + this.Audio + "</Audio>");
writer.WriteRaw("</Options>");
}
public void ReadXml(XmlReader reader) { ... }
}
public void WriteXml(XmlWriter)
{
writer.WriteRaw(“+this.Model+”);
writer.WriteRaw(“”);
writer.WriteRaw(“+this.SeatFinish+”);
writer.WriteRaw(“+this.Audio+”);
writer.WriteRaw(“”);
}
public void ReadXml(XmlReader阅读器){…}
}
然后实现相应的ReadXml()方法来反序列化XML对象表示。我建议使用System.Xml.XPath.XPathNavigator类来简化Xml反序列化的工作,但是XMLReader类中有很多简单的旧方法,您可能会使用这些方法来创建一个虚构的示例。我认为您使用的是默认的Xml序列化机制。如果是那样的话,请看一下屏幕。它允许将序列化挂钩添加到现有的XML序列化机制中。然后,您可以修改XML表示,而无需触及现有的对象模型。请参阅上一篇文章 我相信把它和一般类型的茶混合在一起是最好的
希望有帮助。
私人设置
与反序列化不兼容。我知道这会起作用,但有没有办法不用创建选项类就可以做到这一点?我从来没有遇到过只使用属性的方法。似乎你应该永远不需要求助于WriteRaw。这里没有正确地转义任何内容,最终将生成无效的XML。
public class Car : IXmlSerializable
{
// Private state
public string Model { get; set; }
public string SeatFinish { get; set; }
public string Audio { get; set; }
public Car()
{
Model = "Toyota";
SeatFinish = "Leather";
Audio = "Awesome Soundz";
}
public void WriteXml(XmlWriter writer)
{
writer.WriteRaw("<Model>" + this.Model + "</Model>");
writer.WriteRaw("<Options>");
writer.WriteRaw("<SeatFinish>" + this.SeatFinish + "</SeatFinish>");
writer.WriteRaw("<Audio>" + this.Audio + "</Audio>");
writer.WriteRaw("</Options>");
}
public void ReadXml(XmlReader reader) { ... }
}