如何使用XmlSerializer对对象集合进行序列化
以下是我迄今为止处理由第三方DLL返回的XmlDocument的步骤。如何使用XmlSerializer对对象集合进行序列化
- 我将XmlDocument保存为SegmentationSummary.xml。
- 我使用XSD.exe创建SegmentationSummary.xsd。
- 我使用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抛出 例外。您可以 :
通过在类型[]通过与 类型的 集合内期望声明类型的串行器。
OR
- 实现从 System.Collections.CollectionBase衍生与 的索引相匹配的Add()方法的强类型集合。
我的问题是:哪些是“最好的”,我该如何去实施解决方案?
我一直使用选项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”并重新生成类文件。之后,序列化工作。
我有同样的问题,因为你做的事:
- 我从XML使用我所产生的XSD.EXE
- 由XSD类(ES)通过使用XSD.EXE和得到的模式从第1步。
- 尝试使用这个类作为类型XMLSerializer的构造后,我得到这个异常消息(假消息):
System.InvalidOperationException:无法生成临时类 (结果= 1)。错误CS0030:无法将类型Type1 []转换为Type1。
另外,xsd.exe生成的结果类有矩阵数据类型(Type [] []),实际上这是我主要关心的。
一旦我将XMLSerializer构造函数与可以在集合内部的类型进行比较,我还通过从模式中的几个元素中删除了maxoccurs =“unbounded”来修改我的xsd文件。新一代的过程给了我新的课程。尝试在XMLSerializer中使用新生成的类后,一切都很顺利。
因此,我建议您声明数组类型(可能是集合的一部分的类型),并将其引入到XMLSerializer构造函数中。另外,从您生成的架构中删除某些元素的maxoccurs =“unbounded”。
我试图创建一个类型[]数组像这样: 类型[] 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
您正在使用哪个版本的.NET?另外,请不要让我们猜测XML的外观。发布示例XML和实际的XSD文件。 – 2009-10-30 01:50:17
对不起,约翰,我正在使用.NET 2.0。我将发布一个XML示例。我想我只是使用“回答你的问题”来追加附加信息。 – Hillarie 2009-10-30 12:13:22