Beta 信息
本文讨论的是某种 Microsoft 产品的 Beta 版本。本文中的信息按“原样”提供,如有更改恕不另行通知。Microsoft 对此 Beta 产品不提供正式产品支持。有关如何获取对 Beta 版本的支持的信息,请参见 Beta 产品文件中包括的文档资料,或查看您下载此版本的 Web 位置。
症状
在使用 XMLSerializer 对象尝试序列化 NameValueCollection 对象时,出现以下异常错误消息:
An unhandled exception of type 'System.InvalidOperationException' occurred in system.xml.dll
Additional information:You must implement the Add(System.String) method on System.Collections.Specialized.NameValueCollection because it inherits from ICollection.
Additional information:You must implement the Add(System.String) method on System.Collections.Specialized.NameValueCollection because it inherits from ICollection.
原因
NameValueCollection 并不直接实现 ICollection 接口。相反, NameValueCollection 扩展 NameObjectCollectionBase。这样,就会实现 ICollection 接口,并且在 NameValueCollection 类中不实现重载 Add(system.string) 方法。在使用 XMLSerializer 时, XmlSerializer 尝试将 NameValueCollection 序列化或反序列化为一般 ICollection。因此,它查找默认的 Add(System.String)。如果没有 Add(system.String) 方法,就会发生异常。替代方法
要解决此问题,请使用 SoapFormatter 类进行序列化,而不是使用 XML 进行序列化。注意 要使用 SoapFormatter 类,您必须添加对 System.Runtime.Serialization.Formatters.Soap.dll 的引用。
Visual C# .NET 代码
以下代码描述如何在 Visual C# .NET 中使用 SOAPFormatter:
using System; using System.IO; using System.Xml; using System.Xml.Serialization; using System.Collections.Specialized; using System.Runtime.Serialization.Formatters.Soap; namespace MyConsoleApplication { class Class1 { [STAThread] static void Main(string[] args) { // Defining a NameValueCollection object NameValueCollection namValColl = new NameValueCollection(); // Adding some sample data to NameValueCollection Object namValColl.Add("name1", "value1"); // Serializing NameValueCollection object by using SoapFormatter SoapFormatter sf = new SoapFormatter(); Stream strm1 = File.Open(@"C:/datasoap.xml", FileMode.OpenOrCreate,FileAccess.ReadWrite); sf.Serialize(strm1,namValColl); strm1.Close(); // End of SOAP Serialization // Deserializing the XML file into NameValueCollection object // by using SoapFormatter SoapFormatter sf1 = new SoapFormatter(); Stream strm2 = File.Open(@"C:/datasoap.xml", FileMode.Open,FileAccess.Read); NameValueCollection namValColl1 = (NameValueCollection)sf1.Deserialize(strm2); strm2.Close(); // End of SOAP Deserialization } } }
Visual Basic .NET 代码
以下代码描述如何在 Visual Basic .NET 中使用 SoapFormatter:
Imports System Imports System.IO Imports System.Xml.Serialization Imports System.Collections.Specialized Imports System.Runtime.Serialization.Formatters.Soap Module Module1 Sub Main() ' Defining a NameValueCollection object Dim namValColl As New NameValueCollection() ' Adding some sample data to NameValueCollection Object namValColl.Add("name1", "value1") ' Serializing NameValueCollection object by using SoapFormatter Dim sf As SoapFormatter = New SoapFormatter() Dim strm1 As Stream = File.Open("C:/datasoapvb.xml", FileMode.OpenOrCreate, FileAccess.ReadWrite) sf.Serialize(strm1, namValColl) strm1.Close() ' End of SOAP Serialization ' Deserializing the XML file into NameValueCollection object ' by using SoapFormatter Dim sf1 As SoapFormatter = New SoapFormatter() Dim strm2 As Stream = File.Open("C:/datasoapvb.xml", FileMode.Open, FileAccess.Read) Dim namValColl1 As NameValueCollection = sf1.Deserialize(strm2) strm2.Close() ' End of SOAP Deserialization End Sub End Module
状态
这种现象是设计使然。更多信息
重现问题的步骤
- 启动 Microsoft Visual Studio .NET。
- 在“文件”菜单上,指向“新建”,然后单击“项目”。
- 在“项目类型”下面,单击“Visual C# 项目”或“Visual Basic 项目”,然后单击“模板”下面的“控制台应用程序”。
- 将该项目命名为 MyConsoleApplication,然后单击“确定”。
- 将现有代码替换为以下代码:
Visual C# .NET 代码
using System; using System.IO; using System.Xml.Serialization ; using System.Collections.Specialized; namespace MyConsoleApplication { class Class1 { [STAThread] static void Main(string[] args) { // Defining a NameValueCollection object. NameValueCollection namValColl = new NameValueCollection(); // Adding some sample data to NameValueCollection Object namValColl.Add("name1", "value1"); // Serializing the NameValueCollection object using XMLSerializer XmlSerializer mySerializer = new XmlSerializer(typeof(NameValueCollection)); Stream strm1 = File.Open(@"C:/datasoap.xml", FileMode.OpenOrCreate,FileAccess.ReadWrite); mySerializer.Serialize(strm1, namValColl); strm1.Close(); } } }
使用 Visual Basic .NET 代码
Imports System Imports System.IO Imports System.Xml.Serialization Imports System.Collections.Specialized Module Module1 Sub Main() ' Defining a NameValueCollection object. Dim namValColl As New NameValueCollection ' Adding some sample data to NameValueCollection Object namValColl.Add("name1", "value1") ' Serializing the NameValueCollection object using XMLSerializer Dim mySerializer As New XmlSerializer(GetType(NameValueCollection)) Dim strm1 As Stream strm1 = File.Open("C:/datasoap.xml", FileMode.OpenOrCreate, FileAccess.ReadWrite) mySerializer.Serialize(strm1, namValColl) strm1.Close() End Sub End Module
- 在“调试”菜单上,单击“启动”。此时,就会出现本文“症状”一节中描述的异常错误消息。
参考
有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:323503 WebCast:XML Serialization and Sample Code
314150 INFO:Roadmap for XML Serialization in the .NET Framework
这篇文章中的信息适用于:
- Microsoft Visual Basic .NET (2003)
- Microsoft Visual Basic .NET (2002)
- Microsoft Visual C# .NET (2003)
- Microsoft Visual C# .NET (2002)
- Microsoft XML Classes (included with the .NET Framework 1.0)
- Microsoft XML Classes (included with the .NET Framework 1.1)
最近更新: | 2003-7-3 (1.4) |
关键字 | kberrmsg kbXML kbSerial kbCollections kbCollectionClass kbprb KB814187 kbAudDeveloper |