C# C语言中的XML序列化与反序列化#

C# C语言中的XML序列化与反序列化#,c#,.net,xml-serialization,C#,.net,Xml Serialization,假设我有一个XML,我想转换成.net对象。我怎么能做到这一点呢?我试过了,但它不能正常工作 <job id="ID00004" name="PeakValCalcO"> <uses file="Seismogram_FFI_0_1_ID00003.grm" link="input" /> <uses file="PeakVals_FFI_0_1_ID00003.bsa" link="output" /> </job> <job id

假设我有一个XML,我想转换成.net对象。我怎么能做到这一点呢?我试过了,但它不能正常工作

<job id="ID00004" name="PeakValCalcO">
  <uses file="Seismogram_FFI_0_1_ID00003.grm" link="input" />
  <uses file="PeakVals_FFI_0_1_ID00003.bsa" link="output" />
</job>
<job id="ID00005" name="SeismogramSynthesis" >
  <uses file="FFI_0_1_txt.variation-s07930-h00000" link="input" />
  <uses file="Seismogram_FFI_0_1_ID00005.grm" link="output" />
</job>
公共类作业:列表{}
公开课工作
{
公共字符串id{get;set;}
公共字符串名称{get;set;}
公共列表文件{get;set;}
}
公共类用途
{
公共字符串文件{get;set;}
公共字符串链接{get;set;}
}
私有void Form1\u加载(对象发送方、事件参数e)
{
XmlSerializer serializer=新的XmlSerializer(作业类型));
TextReader tr=新的StreamReader(“CyberShake_100.xml”);
作业b=(作业)序列化程序。反序列化(tr);
tr.Close();
}

您可以使用XSD.exe工具生成与XML匹配的类结构。这可能是拥有可工作的序列化对象层次结构的最简单方法。

您可以使用XSD.exe工具生成与XML匹配的类结构。这可能是拥有可工作的序列化对象层次结构的最简单方法。

您需要了解
上的
id
name
是XML属性,您还需要在类中表示这些属性:

public class jobs : List<job> { }

    public class job
    {
        public string id { get; set; }
        public string name { get; set; }
        public List<uses> Files { get; set; }
    }
    public class uses
    {
        public string file { get; set; }
        public string link { get; set; }
    }



 private void Form1_Load(object sender, EventArgs e)
        {

           XmlSerializer serializer = new XmlSerializer(typeof(jobs)); 
           TextReader tr = new StreamReader("CyberShake_100.xml"); 
           job b = (job)serializer.Deserialize(tr); 
           tr.Close(); 
    }
公共类作业
{
[XmlAttribute]
公共字符串id{get;set;}
[XmlAttribute]
公共字符串名称{get;set;}
公共列表文件{get;set;}
}
这同样适用于
标记及其类表示


另外:一个有效的XML文档总是有一个根元素,并且只有一个根-您的XML片段不是一个有效的XML文档。

您需要了解
上的
id
name
是XML属性-您也需要在类中表达:

public class jobs : List<job> { }

    public class job
    {
        public string id { get; set; }
        public string name { get; set; }
        public List<uses> Files { get; set; }
    }
    public class uses
    {
        public string file { get; set; }
        public string link { get; set; }
    }



 private void Form1_Load(object sender, EventArgs e)
        {

           XmlSerializer serializer = new XmlSerializer(typeof(jobs)); 
           TextReader tr = new StreamReader("CyberShake_100.xml"); 
           job b = (job)serializer.Deserialize(tr); 
           tr.Close(); 
    }
公共类作业
{
[XmlAttribute]
公共字符串id{get;set;}
[XmlAttribute]
公共字符串名称{get;set;}
公共列表文件{get;set;}
}
这同样适用于
标记及其类表示


另外:一个有效的XML文档总是有一个根元素,并且只有一个根-您的XML片段不是一个有效的XML文档。

这不是一个有效的XML文档,因为它有多个根。这就是为什么不能使用框架中的现成内容。

这不是有效的XML文档,因为它有多个根。这就是为什么您不能使用框架中的现成内容。

至少您需要id、名称、文件和链接成员上的
[xmldattribute]


您还强制转换到错误的类型,应该是
jobs b=(jobs)serializer

至少您需要id、名称、文件和链接成员上的
[xmldattribute]


您还强制转换到错误的类型,应该是
jobs b=(jobs)serializer

嗯,这里有几件事不对:

1)您的xml文档没有根元素

它需要看起来更像这样:

public class job
{
    [XmlAttribute]
    public string id { get; set; }
    [XmlAttribute]
    public string name { get; set; }
    public List<uses> Files { get; set; }
}
<jobs>
  <job id="ID00004" name="PeakValCalcO">
    <uses file="Seismogram_FFI_0_1_ID00003.grm" link="input" />
    <uses file="PeakVals_FFI_0_1_ID00003.bsa" link="output" />
  </job>
  <job id="ID00005" name="SeismogramSynthesis" >
    <uses file="FFI_0_1_txt.variation-s07930-h00000" link="input" />
    <uses file="Seismogram_FFI_0_1_ID00005.grm" link="output" />
  </job>
</jobs>
对于复杂的xml文档,这往往会变得有点乏味-有一个工具
XSD.exe
,可以为您自动完成所有这些

3)您选择了错误的类型

即使序列化成功,您也会得到一个
invalidcastexpation
尝试将
作业
实例转换为
作业
。请尝试以下方法:

[XmlRoot("jobs")]
public class jobs : List<job> { }

public class job
{
    [XmlAttribute]
    public string id { get; set; }
    [XmlAttribute]
    public string name { get; set; }
    [XmlElement("uses")]
    public List<uses> Files { get; set; }
}

public class uses
{
    [XmlAttribute]
    public string file { get; set; }
    [XmlAttribute]
    public string link { get; set; }
}

嗯,这里有几件事不对:

1)您的xml文档没有根元素

它需要看起来更像这样:

public class job
{
    [XmlAttribute]
    public string id { get; set; }
    [XmlAttribute]
    public string name { get; set; }
    public List<uses> Files { get; set; }
}
<jobs>
  <job id="ID00004" name="PeakValCalcO">
    <uses file="Seismogram_FFI_0_1_ID00003.grm" link="input" />
    <uses file="PeakVals_FFI_0_1_ID00003.bsa" link="output" />
  </job>
  <job id="ID00005" name="SeismogramSynthesis" >
    <uses file="FFI_0_1_txt.variation-s07930-h00000" link="input" />
    <uses file="Seismogram_FFI_0_1_ID00005.grm" link="output" />
  </job>
</jobs>
对于复杂的xml文档,这往往会变得有点乏味-有一个工具
XSD.exe
,可以为您自动完成所有这些

3)您选择了错误的类型

即使序列化成功,您也会得到一个
invalidcastexpation
尝试将
作业
实例转换为
作业
。请尝试以下方法:

[XmlRoot("jobs")]
public class jobs : List<job> { }

public class job
{
    [XmlAttribute]
    public string id { get; set; }
    [XmlAttribute]
    public string name { get; set; }
    [XmlElement("uses")]
    public List<uses> Files { get; set; }
}

public class uses
{
    [XmlAttribute]
    public string file { get; set; }
    [XmlAttribute]
    public string link { get; set; }
}

什么是不正确的?您是否收到错误或读取对象出错?如果收到错误,您会收到什么错误消息?无错误它不会在作业b=(作业)序列化程序后运行。反序列化(tr);别忘了处理StreamReader:)@Disposer为纪念他的尼克而战斗;)什么是不正确的?您是否收到错误或读取对象出错?如果收到错误,您会收到什么错误消息?无错误它不会在作业b=(作业)序列化程序后运行。反序列化(tr);别忘了处理StreamReader:)@Disposer为纪念他的尼克而战斗;)你是对的,但是XSD工具为你的代码添加了很多东西!也许有一些技巧我不知道,但当我使用它时,它使用7行XML文件创建了一个大约800行的
.cs
文件。你是对的,但是XSD工具为你的代码添加了很多东西!也许有一些技巧我不知道,但当我使用它时,它使用7行XML文件创建了一个大约800行的
.cs
文件。