如何使用XmlSerializer对对象集合进行序列化

如何使用XmlSerializer对对象集合进行序列化

问题描述:

以下是我迄今为止处理由第三方DLL返回的XmlDocument的步骤。如何使用XmlSerializer对对象集合进行序列化

  1. 我将XmlDocument保存为SegmentationSummary.xml。
  2. 我使用XSD.exe创建SegmentationSummary.xsd。
  3. 我使用XSD.exe创建SegmentationSummary.cs。

以下是SegmentationSummary.cs的示例。请注意,ShmResult是根节点的表示形式。

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "omitted")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "omitted", IsNullable = false)] 
public partial class ShmResult 
{ 
    private ShmResultDownloadDetail[] downloadDetailField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("DownloadDetail")] 
    public ShmResultDownloadDetail[] DownloadDetail 
    { 
     get 
     { 
      return this.downloadDetailField; 
     } 
     set 
     { 
      this.downloadDetailField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "omitted")] 
public partial class ShmResultDownloadDetail 
{ 
    private string modelCodeField; 

    /// <remarks/> 
    public string ModelCode 
    { 
     get 
     { 
      return this.modelCodeField; 
     } 
     set 
     { 
      this.modelCodeField = value; 
     } 
    } 
} 

现在,我想用这个来读取XmlDocument的,并开始与SegmentationSummary.cs类工作。这是我写的代码:

private XmlDocument _document; 
SegmentationSummary.ShmResult _Result; 
    private void LoadXML() 
    { 
     XmlReader xmlRdr = new XmlNodeReader(_document); 
     System.Xml.Serialization.XmlSerializer s = new System.Xml.Serialization.XmlSerializer(typeof(SegmentationSummary.ShmResult)); 
     _Result = (SegmentationSummary.ShmResult)s.Deserialize(xmlRdr); 
    } 

当执行的loadXML(),我得到这种品种例外:

试验方法 SegmentationSummaryHandlerTest.TestMethod1 抛出异常: System.InvalidOperationException: 无法生成临时类 (结果= 1)。错误CS0030:不能 转换型 'MERC.AIRCAT.SHMCoreInterface.SegmentationSummary.ShmResultDownloadDetail []' 到 'MERC.AIRCAT.SHMCoreInterface.SegmentationSummary.ShmResultDownloadDetail' 错误CS0029:无法隐式转换 型 “MERC.AIRCAT。 SHMCoreInterface.SegmentationSummary.ShmResultDownloadDetail” 到 'MERC.AIRCAT.SHMCoreInterface.SegmentationSummary.ShmResultDownloadDetail []'

现在,在http://msdn.microsoft.com/en-us/library/ms950721.aspx状态的常见问题解答如下:

问:如何序列化 对象的集合?

答:当集合包含了未申报的 构造XmlSerializer的的 类型的XmlSerializer抛出 例外。您可以 :

  1. 通过在类型[]通过与 类型的 集合内期望声明类型的串行器。

    OR

  2. 实现从 System.Collections.CollectionBase衍生与 的索引相匹配的Add()方法的强类型集合。

我的问题是:哪些是“最好的”,我该如何去实施解决方案?

+0

我试图创建一个类型[]数组像这样: 类型[] serializedTypes =新类型[] { typeof运算(SegmentationSummary.Time) typeof运算(SegmentationSummary.TrendGap) typeof运算(SegmentationSummary.ShmResultAirDropSummaryAirDrop), typeof(SegmentationSummary.ShmResultSortieSummarySortie) }; System.Xml.Serialization.XmlSerializer s = new System.Xml.Serialization.XmlSerializer(typeof(SegmentationSummary.ShmResult),serializedTypes); 但我仍然收到相同的错误消息。 – Hillarie 2009-10-29 15:19:52

+0

您正在使用哪个版本的.NET?另外,请不要让我们猜测XML的外观。发布示例XML和实际的XSD文件。 – 2009-10-30 01:50:17

+0

对不起,约翰,我正在使用.NET 2.0。我将发布一个XML示例。我想我只是使用“回答你的问题”来追加附加信息。 – Hillarie 2009-10-30 12:13:22

我一直使用选项2在那里,所以你的东西有点像这可能工作:

public class ShmResult : List<ShmResultDownloadDetail> { } 

微软有一个错误在这里。它从2003年开始就已经出来了。我知道线程已经老化了,但是对于其他人来说,这是一个头疼的问题。 XSD一代是错误的。在上面的步骤中,使用xsd.exe从xml生成xsd只是看起来不对。我使用了一个名为trang的工具(open source java),您可以使用该工具创建xsd。实际上,您可以使用多个XML文件来创建它。然后,使用xsd.exe创建.cs文件。这工作。

我遇到了类似的问题。

序列化嵌套的未绑定元素存在问题。 Here is an explanation.

要解决此问题,我从xsd中删除了maxoccurs =“unbounded”并重新生成类文件。之后,序列化工作。

我有同样的问题,因为你做的事:

  1. 我从XML使用我所产生的XSD.EXE
  2. 由XSD类(ES)通过使用XSD.EXE和得到的模式从第1步。
  3. 尝试使用这个类作为类型XMLSerializer的构造后,我得到这个异常消息(假消息):

System.InvalidOperationException:无法生成临时类 (结果= 1)。错误CS0030:无法将类型Type1 []转换为Type1。

另外,xsd.exe生成的结果类有矩阵数据类型(Type [] []),实际上这是我主要关心的。

一旦我将XMLSerializer构造函数与可以在集合内部的类型进行比较,我还通过从模式中的几个元素中删除了maxoccurs =“unbounded”来修改我的xsd文件。新一代的过程给了我新的课程。尝试在XMLSerializer中使用新生成的类后,一切都很顺利。

因此,我建议您声明数组类型(可能是集合的一部分的类型),并将其引入到XMLSerializer构造函数中。另外,从您生成的架构中删除某些元素的maxoccurs =“unbounded”。