[Mono-bugs] [Bug 40437][Nor] New - Deserialization of collections.

bugzilla-daemon@rocky.ximian.com bugzilla-daemon@rocky.ximian.com
Thu, 27 Mar 2003 17:16:49 -0500 (EST)


Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.

Changed by miguel@ximian.com.

http://bugzilla.ximian.com/show_bug.cgi?id=40437

--- shadow/40437	Thu Mar 27 17:16:49 2003
+++ shadow/40437.tmp.15390	Thu Mar 27 17:16:49 2003
@@ -0,0 +1,183 @@
+Bug#: 40437
+Product: Mono/Class Libraries
+Version: unspecified
+OS: 
+OS Details: 
+Status: NEW   
+Resolution: 
+Severity: 
+Priority: Normal
+Component: System.XML
+AssignedTo: mono-bugs@ximian.com                            
+ReportedBy: miguel@ximian.com               
+QAContact: mono-bugs@ximian.com
+TargetMilestone: ---
+URL: 
+Cc: 
+Summary: Deserialization of collections.
+
+XmlSerialization treats fields that
+implement IEnumerable and ICollection specially.  I have attached a
+sample, and there is some documentation in the XmlSerialization class
+that describe this in more depth.
+
+Attached is a sample:
+
+using System;
+using System.Collections;
+using System.Xml;
+using System.Xml.Serialization;
+using System.IO;
+
+public class User {
+        public string Name;
+        public string Password;
+        public string Role;
+}
+
+public class UserCollection: System.Collections.CollectionBase
+{
+        public UserCollection()
+        {
+                // empty
+        }
+
+        public UserCollection(User[] items)
+        {
+                this.AddRange(items);
+        }
+
+        public virtual void AddRange(User[] items)
+        {
+                foreach (User item in items)
+                {
+                        this.List.Add(item);
+                }
+        }
+
+        public virtual void AddRange(UserCollection items)
+        {
+                foreach (User item in items)
+                {
+                        this.List.Add(item);
+                }
+        }
+
+        public virtual void Add(User value)
+        {
+                this.List.Add(value);
+        }
+
+        public virtual bool Contains(User value)
+        {
+                return this.List.Contains(value);
+        }
+
+        public virtual int IndexOf(User value)
+        {
+                return this.List.IndexOf(value);
+        }
+
+        public virtual void Insert(int index, User value)
+        {
+                this.List.Insert(index, value);
+        }
+
+        public virtual User this[int index]
+        {
+                get
+                {
+                        return (User) this.List[index];
+                }
+                set
+                {
+                        this.List[index] = value;
+                }
+        }
+
+        public virtual void Remove(User value)
+        {
+                this.List.Remove(value);
+        }
+
+        public class Enumerator: System.Collections.IEnumerator
+        {
+                private System.Collections.IEnumerator wrapped;
+
+                public Enumerator(UserCollection collection)
+                {
+                        this.wrapped =
+((System.Collections.CollectionBase)collection).GetEnumerator();
+                }
+
+                public User Current
+                {
+                        get
+                        {
+                                return (User) (this.wrapped.Current);
+                        }
+                }
+
+                object System.Collections.IEnumerator.Current
+                {
+                        get
+                        {
+                                return (User) (this.wrapped.Current);
+                        }
+                }
+
+                public bool MoveNext()
+                {
+                        return this.wrapped.MoveNext();
+                }
+
+                public void Reset()
+                {
+                        this.wrapped.Reset();
+                }
+        }
+
+        public new virtual UserCollection.Enumerator GetEnumerator()
+                {
+                        return new UserCollection.Enumerator(this);
+                }
+}
+
+public class SiteSecurityConfig
+{
+        UserCollection users = new UserCollection();
+        
+        public UserCollection Users { get { return users; } }
+}
+
+class test {
+
+        static void Main ()
+        {
+                string xml = 
+                        "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + 
+                        "<SiteSecurityConfig
+xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"" +
+                        " 
+xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
+                        "  <Users>\n"+
+                        "    <User>\n"+
+                        "      <Name>admin</Name>\n"+
+                        "      <Password>admin</Password>\n"+
+                        "      <Role>admin</Role>\n" + 
+                        "    </User>\n" +
+                        "  </Users>\n" + 
+                "</SiteSecurityConfig>";
+
+                XmlSerializer ser = new XmlSerializer (typeof
+(SiteSecurityConfig));
+                StringReader string_reader = new StringReader (xml);
+                SiteSecurityConfig ss = (SiteSecurityConfig)
+ser.Deserialize (string_reader);
+
+                foreach (User user in ss.Users){
+                        Console.WriteLine ("Login: {0} Pass: {1} Role:
+{2}", user.Name, user.Password, user.Role);
+                }
+        }
+}