Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单的C#Xml序列化_C#_.net_Xml_Xml Serialization_C# 4.0 - Fatal编程技术网

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