814187 PRB:使用 XmlSerializer 序列化 NameValueCollection 对象时出现“System.InvalidOperationException”错误 (From MKBA)

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.

原因

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

状态

这种现象是设计使然。

更多信息

重现问题的步骤

  1. 启动 Microsoft Visual Studio .NET。
  2. 在“文件”菜单上,指向“新建”,然后单击“项目”。
  3. 在“项目类型”下面,单击“Visual C# 项目”或“Visual Basic 项目”,然后单击“模板”下面的“控制台应用程序”。
  4. 将该项目命名为 MyConsoleApplication,然后单击“确定”。
  5. 将现有代码替换为以下代码:
    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
    
  6. 在“调试”菜单上,单击“启动”。此时,就会出现本文“症状”一节中描述的异常错误消息。

参考

有关其他信息,请单击下面的文章编号,以查看 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值