PRB: "System.InvalidOperationException" Error While Serializing NameValueCollection Objects Using XmlSerializer (814187)
The information in this article applies to:
- 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)
Beta Information This article discusses a Beta release of a Microsoft
product. The information in this article is provided as-is and is subject to
change without notice.
No formal product support is available from
Microsoft for this Beta product. For information about how to obtain support
for a Beta release, see the documentation that is included with the Beta
product files, or check the Web location from which you downloaded the release.
SYMPTOMSWhen you try to serialize NameValueCollection objects by using the XMLSerializer object, you receive the following exception error
message: 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. CAUSENameValueCollection does not directly implement the ICollection interface. Instead, NameValueCollection extends NameObjectCollectionBase. This implements the ICollection interface, and the overloaded Add(system.string) method is not implemented in the NameValueCollection class. When you use the XMLSerializer, the XmlSerializer tries to serialize or deserialize the NameValueCollection as a generic ICollection. Therefore, it looks for the default Add(System.String). In the absence of the Add(system.String) method, the exception is thrown.WORKAROUNDTo work around this problem, use the SoapFormatter class for serialization instead of using XML Serialization.
Note To use the SoapFormatter class, you must add a reference to
System.Runtime.Serialization.Formatters.Soap.dll. Visual C# .NET CodeThe following code describes using the SOAPFormatter in Visual C# .NET: 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 CodeThe following code describes using the SoapFormatter in Visual Basic .NET: 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
STATUS This
behavior is by design.REFERENCES For additional
information, click the following article numbers to view the articles in the
Microsoft Knowledge Base: 323503
WebCast: XML Serialization and Sample Code
314150 INFO: Roadmap for XML Serialization in the .NET Framework
Modification Type: | Major | Last Reviewed: | 9/24/2003 |
---|
Keywords: | kberrmsg kbSerial kbCollections kbCollectionClass kbprb KB814187 kbAudDeveloper |
---|
|