2010-09-02 55 views
2

我有一个类:简单的C#XML序列化

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> 

对于具体的项目,我不能只创建原因一个属性:

public List<string> Options; 

有没有一种方法来指定通过属性的属性是ser在某个xml元素下ialis(在这种情况下是一个“选项”节点)?我可以写一个允许这个的自定义属性吗?任何意见赞赏。

编辑:

我看到有一个选项类工作,但在那里好歹不会产生其他类达致这?例如,我可能想只用一个属性来做到这一点。

理想我想能够指定

[Parent("Options")] 
public string SeatFinish {get;set;} 

回答

5

是域模型或类似的一部分?这听起来像是你希望这些选项可以在汽车对象外重新使用,所以为什么不创建一个单独的选项类?

public class Options 
{ 
    public string SeatFinish {get;set;} 
    public string Audio {get;set;} 
} 

,改变你的Car类来保存Options类:

public class Car 
{ 
    public string Model {get;set;} 
    public Options Options {get;set;} 
} 
+0

我看到这会工作,但有没有做这个而不创建一个选项类呢? – GreyCloud 2010-09-02 09:55:50

+0

我从来没有遇到过使用属性来完成它的方法。 – GenericTypeTea 2010-09-02 10:05:50

3

如果可能的话,请尝试更改类这样的:

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(); 
    } 
} 
+0

'专用集合;'与反序列化不兼容。 – Ani 2010-09-02 09:52:24

+1

@Ani哎呀,你说得很对。习惯的力量。 – Codesleuth 2010-09-02 10:12:07

1

我相信得到你想要的,你是什么将需要实现IXmlSerializable并自己序列化对象。

参见:Custom XML Serialization

首先实现的接口:

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) { ... } 
} 

然后实现相应的ReadXml()方法来反序列化您的XML对象表示。我建议使用System.Xml.XPath.XPathNavigator类来简化XML反序列化的工作,但无论如何,XMLReader类中有很多普通的旧方法,您可能会为某个人为的例子工作。

+0

似乎你应该几乎不需要诉诸WriteRaw。您在这里没有正确地逃避任何事情,并且最终会生成无效的XML。 – Mark 2010-11-24 19:10:18

1

我认为你使用的是默认的XML序列化机制。在这种情况下,请看IXmlSerializable Interface。它允许在现有的XML序列化机制中添加序列化钩子。然后,您可以修改XML表示而不触及现有的对象模型。

0

看看以前的帖子。

C# Serialization XML

相信什么GenericTypeTea说是最好的混合它。

希望它有帮助。