[Mono-devel-list] Deserialization (reflection) bug

Herscovici, Avi AHerscovici at Empirix.com
Wed Jul 2 12:52:55 EDT 2003


Hi guys + lluis,

  Got a new deserialization bug.  I've pasted code.  Problem goes away when
I get rid of the second Add method in obj1 class.  Seems like reflection
doesn't like overloaded methods?  May also have to do with implementing
CollectionBase.  I think I've had the exact same problem that came from the
XmlSerializer constructor (that Lluis fixed) with an example that
implemented collectionbase, but now it is coming from deserialize. Either
way here are the files and the error:


// --------------test.cs---------------
using System;
using System.Xml.Serialization;
using System.IO;
using System.Xml;
using Test;


namespace Serial.test {

public class sertest {

		public static void Save(System.IO.Stream stream, object x)
		{
			XmlSerializer ser = new XmlSerializer(typeof(obj1));
			ser.Serialize(stream, x);
		}

		public static void Save(string filename, object x)
		{
			FileStream str = new FileStream(filename,
FileMode.Create, FileAccess.Write);
			Save(str, x);
			str.Close();
		}

		public static object Load(System.IO.Stream stream)
		{
			object s;
			Console.WriteLine("Debug line 1a");
			XmlSerializer ser = new XmlSerializer(typeof(obj1));
			Console.WriteLine("Debug line 2a");
			s = (object)ser.Deserialize(stream);
			return s;
		}


		public static object Load(string filename)
		{
				object s;
				Console.WriteLine("Debug line 2");
				FileStream str = new FileStream(filename,
FileMode.Open, FileAccess.Read);
				Console.WriteLine("Debug line 3");
				s = Load(str);
				Console.WriteLine("Debug line 4");
				str.Close();
				return s;
		}

	static void Main() {
	string filename = "st4.ser";
	obj1 x =  new obj1();
	x.Add(new obj2());
	Save(filename, x);
	obj1 temp = (obj1)Load(filename);
	Console.WriteLine("Finished");
	}
}
}

// ----------------- obj1.cs -------------
using System;
using System.Collections;
using System.Diagnostics;

namespace Test
{
	public sealed class obj1 : CollectionBase
	{
		public void Add(obj2 sllp)
		{
			InnerList.Add(sllp);
		}

		public void Add(object name, object val)
		{
			InnerList.Add(new obj2(name, val));
		}

		public void Remove(obj2 sllp)
		{
			InnerList.Remove(sllp);
		}

		public obj2 this[int index]
		{
			[DebuggerStepThrough]
			get { return (obj2)InnerList[index]; }
			[DebuggerStepThrough]
			set { InnerList[index] = value; }
		}
	}
}
// ---------------obj2.cs------------------
using System;
using System.Diagnostics;
using System.Collections;

namespace Test
{
	public class obj2
	{
		private object m_name = null;
		private object m_value = null;

		public obj2()
		{
		}

		public obj2(object name, object val)
		{
			m_name = name;
			m_value = val;
		}

		public object Name
		{
			[DebuggerStepThrough]
			get { return m_name; }
			[DebuggerStepThrough]
			set { m_name = value; }
		}

		public object Value
		{
			[DebuggerStepThrough]
			get { return m_value; }
			[DebuggerStepThrough]
			set { m_value = value; }
		}

	}
}



More information about the Mono-devel-list mailing list