Hi,

We've made System.Runtime.Serialization.Formatters.Soap.SoapFormatter work
- it now correctly executes the attached sample under mono/linux.

Please find a diff attached :)

Cheers,

~Tim
-- 
Product Development Consultant
OpenLink Software
Tel: +44 (0) 20 8681 7701
Web: <http://www.openlinksw.com>
Universal Data Access & Data Integration Technology Providers

Index: 
class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/ObjectDeserializer.cs
===================================================================
RCS file: 
/mono/mcs/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/ObjectDeserializer.cs,v
retrieving revision 1.2
diff -u -b -r1.2 ObjectDeserializer.cs
--- 
class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/ObjectDeserializer.cs
       24 Aug 2002 10:39:22 -0000      1.2
+++ 
+class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/ObjectDeserializer.cs
+       17 Oct 2002 13:33:39 -0000
@@ -13,6 +13,9 @@
                const string basicassembly      = "mscorlib";
                const string xmlnsassem         = 
"http://schemas.microsoft.com/clr/nsassem/";;
                const string xmlns              = 
"http://schemas.microsoft.com/clr/ns/";;                               
+               const string xmlns_SOAP_ENC     = 
+"http://schemas.xmlsoap.org/soap/encoding/";;
+               const string xmlns_SOAP_ENV     = 
+"http://schemas.xmlsoap.org/soap/envelope/";;
+
                const string cTarget            = "Target";
                const string cDelegatesClass    = "System.MulticastDelegate";
                const string cMethodName        = "MethodName";
@@ -410,7 +413,7 @@
 
                private string GetMainAssemblyFullNameFromXml(out string AssemblyName)
                {
-                       XmlNode SoapEnvNode= 
FXmlDoc.DocumentElement.GetElementsByTagName("SOAP-ENV:Body").Item(0);
+                       XmlNode SoapEnvNode= 
+FXmlDoc.DocumentElement.GetElementsByTagName("Body", xmlns_SOAP_ENV).Item(0);
                        XmlNode MainObjectNode= SoapEnvNode.ChildNodes.Item(0); 
                        int StartIndex= MainObjectNode.Name.IndexOf(":");
                        string ClassName= MainObjectNode.Name.Substring(StartIndex + 
1, MainObjectNode.Name.Length - StartIndex - 1);           
Index: 
class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/ObjectSerializer.cs
===================================================================
RCS file: 
/mono/mcs/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/ObjectSerializer.cs,v
retrieving revision 1.3
diff -u -b -r1.3 ObjectSerializer.cs
--- 
class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/ObjectSerializer.cs
 24 Aug 2002 10:39:22 -0000      1.3
+++ 
+class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/ObjectSerializer.cs
+ 17 Oct 2002 13:33:44 -0000
@@ -9,6 +9,7 @@
 using System.Xml;
 using System.Reflection;
 using System.Collections;
+using System.Text;
 
 namespace System.Runtime.Serialization.Formatters.Soap
 {
@@ -17,15 +18,18 @@
                /*******const's section******/          
                const string cStringType       = "System.String";
                const string startxmlns        = "xmlns:a";
-               const string startdoc          =  "<SOAP-ENV:Envelope " + 
+               const string startdoc_start    =  "<SOAP-ENV:Envelope " + 
                        "xmlns:xsi= \"http://www.w3.org/2001/XMLSchema-instance\"";  + 
" " + 
                        "xmlns:xsd= \"http://www.w3.org/2001/XMLSchema\"";            + 
" " + 
                        "xmlns:SOAP-ENC= 
\"http://schemas.xmlsoap.org/soap/encoding/\"";  + " " + 
                        "xmlns:SOAP-ENV= 
\"http://schemas.xmlsoap.org/soap/envelope/\"";  + " " + 
-                       "SOAP-ENV:encodingStyle= 
\"http://schemas.xmlsoap.org/soap/encoding/\";>" + " " + 
-                       "<SOAP-ENV:Body>"    + " " + 
-                       "</SOAP-ENV:Body>"   + " " + 
+                       "SOAP-ENV:encodingStyle= 
+\"http://schemas.xmlsoap.org/soap/encoding/\""; + " ";
+               const string startdoc_middle = ">" + " " + 
+                       "<SOAP-ENV:Body>";
+               const string startdoc_end      =  "</SOAP-ENV:Body>"   + " " + 
                        "</SOAP-ENV:Envelope>";
+               const string xmlns_SOAP_ENC     = 
+"http://schemas.xmlsoap.org/soap/encoding/";;
+               const string xmlns_SOAP_ENV     = 
+"http://schemas.xmlsoap.org/soap/envelope/";;
                const string xmlnsassem         = 
"http://schemas.microsoft.com/clr/nsassem/";;
                const string xmlns              = 
"http://schemas.microsoft.com/clr/ns/";;
                const string basicassembly      = "mscorlib";
@@ -45,18 +49,21 @@
                public  ArrayList XmlObjectList; //the list of the xml representation 
of all objects                        
                private ArrayList FObjectList;   //the listof  the object been 
seralized
                private SoapWriter ObjectWrt;
-               private string FCurrentXml;// the object's xml representation 
                /******method's section******/
-               private void AddAssemblyToXml(string assemns)
+               private string ConcatAssembliesToXml()
                {
-                       XmlDocument xmldoc = new XmlDocument();                 
-                       xmldoc.LoadXml(FCurrentXml);
-                       XmlElement RootElemt = xmldoc.DocumentElement;
-                       string xmlns = startxmlns + AssemblyList.Count.ToString();
-                       XmlAttribute NewAttr= xmldoc.CreateAttribute(xmlns);
-                       RootElemt.SetAttributeNode(NewAttr);
-                       RootElemt.SetAttribute(xmlns, assemns);
-                       FCurrentXml= xmldoc.InnerXml;
+                 StringBuilder bld = new StringBuilder ();
+                 for (int inx = 1; inx <= AssemblyList.Count; inx++)
+                   {
+                       string xmlns = startxmlns + inx.ToString();
+                       string assemns = AssemblyList[inx - 1] as string;
+
+                       bld.Append (xmlns);
+                       bld.Append ("='");
+                       bld.Append (assemns);
+                       bld.Append ("'");
+                   }
+                 return bld.ToString();
                }
 
                private int AddAssembly(string assname, string nespname)               
         
@@ -71,7 +78,6 @@
                        if(Result< 0)   
                        {
                                Result= AssemblyList.Add(XmlAssNs);                    
           
-                               AddAssemblyToXml(XmlAssNs);
                        }
                        return Result;
                }
@@ -343,7 +349,6 @@
 
                public void BeginWrite() //writes the basic elements of a soap message
                {
-                       FCurrentXml = startdoc;                 
                }
 
                public ObjectSerializer(Stream store) //assign the current stream
@@ -361,13 +366,22 @@
                        AssemblyList.Clear();
                        XmlObjectList.Clear();                  
                        FObjectList.Clear();                    
-                       FCurrentXml= "";
                }
 
                public void Serialize(object graph)
                {                       
                        SerializeObject(graph, 0); 
-                       ObjectWrt.WriteObjectListToXml(FCurrentXml, FCurrentStream);   
                                                                                       
                                                                    
+                       String FCurrentXml = 
+                           startdoc_start + 
+                           ConcatAssembliesToXml() +
+                           startdoc_middle +
+                           ObjectWrt.ConcatenateObjectList () +
+                           startdoc_end;
+                       XmlDocument XmlDoc = new XmlDocument();
+                       XmlDoc.LoadXml (FCurrentXml);
+                       UTF8Encoding enc = new UTF8Encoding (false, true);
+                       byte [] bytes = enc.GetBytes (XmlDoc.InnerXml);
+                       FCurrentStream.Write (bytes, 0, bytes.Length);
                        CleatLists();
                }
        }
Index: 
class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapReader.cs
===================================================================
RCS file: 
/mono/mcs/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapReader.cs,v
retrieving revision 1.2
diff -u -b -r1.2 SoapReader.cs
--- 
class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapReader.cs
       24 Aug 2002 10:39:22 -0000      1.2
+++ 
+class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapReader.cs
+       17 Oct 2002 13:33:52 -0000
@@ -10,6 +10,8 @@
        internal class SoapReader
        {
                /******const section******/
+               const string xmlns_SOAP_ENC     = 
+"http://schemas.xmlsoap.org/soap/encoding/";;
+               const string xmlns_SOAP_ENV     = 
+"http://schemas.xmlsoap.org/soap/envelope/";;
 
                const string cSoapRef           = "href";
                const string cObjectRef         = "ref-";
@@ -65,7 +67,7 @@
                public string ReadReferenceFullNameFromXml(string RefereneId)
                {
                        string RefId= cObjectRef + RefereneId;
-                       XmlNodeList NodeList = 
FXmlDoc.DocumentElement.GetElementsByTagName("SOAP-ENV:Body").Item(0).ChildNodes;
+                       XmlNodeList NodeList = 
+FXmlDoc.DocumentElement.GetElementsByTagName("Body", 
+xmlns_SOAP_ENV).Item(0).ChildNodes;
                        bool Continue= true;
                        int index= 0;
                        string Result= "";
@@ -457,7 +459,7 @@
                /**Assemblies reader**/
                public string GetAssemblyNameFromId(int id)
                {                 
-                       XmlNodeList ObjList= 
((XmlElement)FXmlDoc.DocumentElement.GetElementsByTagName("SOAP-ENV:Body").Item(0)).ChildNodes;
+                       XmlNodeList ObjList= 
+((XmlElement)FXmlDoc.DocumentElement.GetElementsByTagName("Body", 
+xmlns_SOAP_ENV).Item(0)).ChildNodes;
                        bool Continue= true;
                        int index= 0;
                        string AssemblyName= "";
@@ -479,7 +481,7 @@
 
                private string GetReferenceNameFromId(int id, ref XmlElement 
RefElement)
                {
-                       XmlNodeList ObjList= 
((XmlElement)FXmlDoc.DocumentElement.GetElementsByTagName("SOAP-ENV:Body").Item(0)).ChildNodes;
+                       XmlNodeList ObjList= 
+((XmlElement)FXmlDoc.DocumentElement.GetElementsByTagName("Body", 
+xmlns_SOAP_ENV).Item(0)).ChildNodes;
                        bool Continue= true;
                        int index= 0;
                        string Result= "";
@@ -536,7 +538,7 @@
                public XmlElement GetCurrentElement(string ElementName, string 
ElementId)
                {
                        string RefId= cObjectRef + ElementId;
-                       XmlNodeList NodeList = 
((XmlElement)FXmlDoc.DocumentElement.GetElementsByTagName("SOAP-ENV:Body").Item(0)).GetElementsByTagName(ElementName);
+                       XmlNodeList NodeList = 
+((XmlElement)FXmlDoc.DocumentElement.GetElementsByTagName("Body", 
+xmlns_SOAP_ENV).Item(0)).GetElementsByTagName(ElementName);
                        bool Continue= true;
                        int index= 0;
                        string Result= "";
Index: 
class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapWriter.cs
===================================================================
RCS file: 
/mono/mcs/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapWriter.cs,v
retrieving revision 1.3
diff -u -b -r1.3 SoapWriter.cs
--- 
class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapWriter.cs
       24 Aug 2002 10:39:22 -0000      1.3
+++ 
+class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapWriter.cs
+       17 Oct 2002 13:33:55 -0000
@@ -17,7 +17,10 @@
                {               
                        /******const section******/
                        const string cNullObject     = "xsi:null=\"1\"/";
-                       const string cSoapEnv        = "SOAP-ENV:Body";
+                       const string cSoapEnv        = "Body";
+                       const string xmlns_SOAP_ENC     = 
+"http://schemas.xmlsoap.org/soap/encoding/";;
+                       const string xmlns_SOAP_ENV     = 
+"http://schemas.xmlsoap.org/soap/envelope/";;
+                       
                        const string cStartTag       = "<";
                        const string cEndTag         = ">";
                        const string cNumber         = "#";
@@ -37,7 +40,7 @@
                        public ArrayList FXmlObjectList;
                        public  int FReferenceNumber;
                        /******method's section******/
-                       private string ConcatenateObjectList()
+                       public string ConcatenateObjectList()
                        {
                                string XmlResult= "";
                                object[] XmlList= FXmlObjectList.ToArray();
@@ -160,18 +163,6 @@
                        public void WriteStructTypeToXml(string StructName)
                        {
                        }               
-
-                       public void WriteObjectListToXml(string SoapDoc, Stream 
SoapStream)
-                       {
-                               string XmlResult= ConcatenateObjectList();
-                               XmlDocument XmlDoc= new XmlDocument();
-                               XmlDoc.LoadXml(SoapDoc);                        
-                               XmlNode XNode= 
XmlDoc.DocumentElement.GetElementsByTagName(cSoapEnv).Item(0);
-                               XNode.InnerXml= XmlResult;
-                               StreamWriter SoapWrt= new StreamWriter(SoapStream);
-                               SoapWrt.Write(XmlDoc.InnerXml);
-                               SoapWrt.Close();                                
-                       }
 
                        public string GenerateSchemaArrayType(string ArrayType, int 
ArrayLength, int AssemblyIndex)
                        {
Index: class/System.XML/System.Xml/XmlDocument.cs
===================================================================
RCS file: /mono/mcs/class/System.XML/System.Xml/XmlDocument.cs,v
retrieving revision 1.38
diff -u -b -r1.38 XmlDocument.cs
--- class/System.XML/System.Xml/XmlDocument.cs  12 Oct 2002 22:17:24 -0000      1.38
+++ class/System.XML/System.Xml/XmlDocument.cs  17 Oct 2002 13:34:17 -0000
@@ -349,8 +349,20 @@
                public virtual XmlNodeList GetElementsByTagName (string name)
                {
                        ArrayList nodeArrayList = new ArrayList ();
-                       this.searchNodesRecursively (this, name, String.Empty, 
nodeArrayList);
+                       this.searchNodesRecursively (this, name, nodeArrayList);
                        return new XmlNodeArrayList (nodeArrayList);
+               }
+
+               private void searchNodesRecursively (XmlNode argNode, string argName, 
+                       ArrayList argArrayList)
+               {
+                       XmlNodeList xmlNodeList = argNode.ChildNodes;
+                       foreach (XmlNode node in xmlNodeList){
+                               if (node.Name.Equals (argName))
+                                       argArrayList.Add (node);
+                               else    
+                                       this.searchNodesRecursively (node, argName, 
+argArrayList);
+                       }
                }
 
                private void searchNodesRecursively (XmlNode argNode, string argName, 
string argNamespaceURI, 
Index: class/System.XML/System.Xml/XmlElement.cs
===================================================================
RCS file: /mono/mcs/class/System.XML/System.Xml/XmlElement.cs,v
retrieving revision 1.30
diff -u -b -r1.30 XmlElement.cs
--- class/System.XML/System.Xml/XmlElement.cs   21 Sep 2002 04:20:31 -0000      1.30
+++ class/System.XML/System.Xml/XmlElement.cs   17 Oct 2002 13:34:17 -0000
@@ -178,8 +178,20 @@
                public virtual XmlNodeList GetElementsByTagName (string name)
                {
                        ArrayList nodeArrayList = new ArrayList ();
-                       this.searchNodesRecursively (this, name, String.Empty, 
nodeArrayList);
+                       this.searchNodesRecursively (this, name, nodeArrayList);
                        return new XmlNodeArrayList (nodeArrayList);
+               }
+
+               private void searchNodesRecursively (XmlNode argNode, string argName, 
+                       ArrayList argArrayList)
+               {
+                       XmlNodeList xmlNodeList = argNode.ChildNodes;
+                       foreach (XmlNode node in xmlNodeList){
+                               if (node.Name.Equals (argName))
+                                       argArrayList.Add (node);
+                               else    
+                                       this.searchNodesRecursively (node, argName, 
+argArrayList);
+                       }
                }
 
                private void searchNodesRecursively (XmlNode argNode, string argName, 
string argNamespaceURI, 
Index: class/System.XML/System.Xml/XmlTextWriter.cs
===================================================================
RCS file: /mono/mcs/class/System.XML/System.Xml/XmlTextWriter.cs,v
retrieving revision 1.24
diff -u -b -r1.24 XmlTextWriter.cs
--- class/System.XML/System.Xml/XmlTextWriter.cs        23 Sep 2002 00:39:30 -0000     
 1.24
+++ class/System.XML/System.Xml/XmlTextWriter.cs        17 Oct 2002 13:34:22 -0000
@@ -556,6 +556,8 @@
                                {
                                        string existingPrefix = 
namespaceManager.LookupPrefix (ns);
 
+                                       if (existingPrefix == String.Empty && 
+!namespaceManager.HasNamespace (prefix))
+                                         namespaceManager.AddNamespace (prefix, ns);
                                        if (prefix == String.Empty)
                                                prefix = existingPrefix;
 
Index: class/System.XML/System.Xml/XmlWriter.cs
===================================================================
RCS file: /mono/mcs/class/System.XML/System.Xml/XmlWriter.cs,v
retrieving revision 1.11
diff -u -b -r1.11 XmlWriter.cs
--- class/System.XML/System.Xml/XmlWriter.cs    26 Aug 2002 03:14:30 -0000      1.11
+++ class/System.XML/System.Xml/XmlWriter.cs    17 Oct 2002 13:34:22 -0000
@@ -63,7 +63,13 @@
                public void WriteAttributeString (string prefix, string localName, 
string ns, string value)
                {
                        if ((prefix == "xmlns") || (localName == "xmlns"))
+                         {
                                ns = value;
+                               if (prefix == "xmlns" && namespaceManager.HasNamespace 
+(localName))
+                                 return;
+                               else if (localName == "xmlns" && 
+namespaceManager.HasNamespace (String.Empty))
+                                 return;
+                         }
                        
                        WriteStartAttribute (prefix, localName, ns);
                        WriteString (value);
using System;
using System.IO;

namespace testit
{
  [Serializable] public class SPoint
    {
      public Double x = 1;
      public Double y = 2;
      public SPoint () {;}
    }
  class Class1
    {

      static void serialize()
        {
          System.Runtime.Serialization.IFormatter xx = 
              new System.Runtime.Serialization.Formatters.Soap.SoapFormatter ();
          FileStream _out = new FileStream ("out.xml", FileMode.Create, 
FileAccess.Write, FileShare.None);
          xx.Serialize (_out, new SPoint());
        }
      static void deserialize()
        {
          System.Runtime.Serialization.IFormatter xx = 
              new System.Runtime.Serialization.Formatters.Soap.SoapFormatter ();
          FileStream _out = new FileStream ("out.xml", FileMode.Open, FileAccess.Read, 
FileShare.Read);
          SPoint ob = xx.Deserialize (_out) as SPoint;
          Console.WriteLine (ob.x);
        }
      public static void Main (String [] args)
        {
          if (args.Length > 0)
            deserialize();
          else
            serialize();
        }
    }
}

Reply via email to