[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);
+ }
+ }
+}