[Mono-list] XmlIncludeAttribute missing class

Chris Turchin chris@turchin.net
Wed, 11 May 2005 05:34:41 -0700 (PDT)


Hi,

I don't think you can serialize hashtables (easily) to XML:

http://blogs.msdn.com/psheill/archive/2005/04/09/406823.aspx
http://codebetter.com/blogs/geoff.appleby/archive/2004/11/13/32005.aspx

I did something similar a while back in mono with ArrayLists and that worked
fine:

        [Serializable]
        public  class SearchList
        {
                [XmlElement(typeof(SearchType), ElementName = "SearchType")]
                public ArrayList Items = new ArrayList();
etc...

but I remember reading back then that hastables were a pain...

Regards,

--chris



On Wed, 11 May 2005, Ricardo Gladwell wrote:

> I'm getting the following exception when I attempt to deserialize some
> objects in my application using System.Xml.Serialization:
>
> System.InvalidOperationException: The type WebPuppy.Model.Site was not
> expected. Use the XmlInclude or SoapInclude attribute to specify types
> that are not known statically.
>
> I've been careful to include all the relevant objects using the
> XmlIncludeAttribute so I can't figure out why the XML serializer is not
> properly finding the Site object. See code fragment below:
>
> using System.Collections;
> using System.IO;
> using System.Xml.Serialization;
>
> public class Test {
>      public static void Main () {
>          Configuration configuration = new Configuration();
>          Site site = new Site();
>          site.Id = "id";
>          configuration.Sites.Add( site );
>          XmlSerializer serializer = new XmlSerializer (typeof
> (Configuration));
>          using (FileStream fs = new FileStream ("test.xml",
> FileMode.Create)) {
>              serializer.Serialize (fs, configuration);
>          }
>      }
> }
>
> public class Configuration {
>
> 	Folder sites = new Folder();
>
> 	public Folder Sites
> 	{
> 		get {
> 			return sites;
> 		}
> 		set {
> 			this.sites = value;
> 		}
> 	}
>
> }
>
> [XmlInclude (typeof (Folder))]
> [XmlInclude (typeof (Site))]
> public abstract class Artifact {
> 	public string Id;
> }
>
> public class Folder : Artifact, IEnumerable
> {
> 	private Hashtable artifacts = new Hashtable ();
>
> 	public IEnumerator GetEnumerator ()
> 	{
> 		return artifacts.Values.GetEnumerator ();
> 	}
>
> 	public void Add(object o) {
>          Artifact artifact = (Artifact) o;
> 		artifacts[artifact.Id] = (Artifact) artifact;
> 	}
> }
>
> public class Site : Folder
> {
> }
> _______________________________________________
> Mono-list maillist  -  Mono-list@lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list
>