internal State(BinaryFormatter parent, SerializationHintsAttribute hints, Type t)
			{
				BinaryFormatter.WriteLine("New State: {0}", t != null ? t.FullName : "<null>");

				TypeDescriptor td = (t != null) ? new TypeDescriptor(t) : null;

				m_parent = parent;
				m_value = new TypeHandler(parent, hints, td);
			}
			internal TypeHandler(BinaryFormatter bf, SerializationHintsAttribute hints, TypeDescriptor expected)
			{
				m_bf = bf;

				m_value = null;
				m_type = null;
				m_hints = hints;

				m_typeExpected = expected;
				m_typeForced = null;
			}
		static public SerializationHintsAttribute GetHints(MemberInfo mi)
		{
			SerializationHintsAttribute hintsDst = null;

			if(mi != null)
			{
				//In order to break the dependency between Microsoft.SPOT.Debugger and Microsoft.SPOT.Native
				//SerializationHintsAttribute class is defined in both places. 
				//Microsoft.SPOT.Debugger.SerializationHintsAttribute needs to remain backwards compatible with 
				//Microsoft.SPOT.SerializationHintsAttribute.  This method converts the attributes applied to a 
				//client assembly with Native class to the debugger class.


				object[] lst = mi.GetCustomAttributes(false);
				bool fFoundSerializationHints = false;

				for(int iAttr = 0; iAttr < lst.Length; iAttr++)
				{
					object hintsSrc = lst[iAttr];

					if(hintsSrc.GetType().FullName == "Microsoft.SPOT.SerializationHintsAttribute")
					{
						if(fFoundSerializationHints)
						{
							throw new NotSupportedException("Only one attribute per type!");
						}

						fFoundSerializationHints = true;

						hintsDst = new SerializationHintsAttribute();

						ConvertObject(hintsDst, hintsSrc);
					}
				}
			}

			return hintsDst;
		}
		private SerializationHintsAttribute BuildHints(Type t)
		{
			if(t == null)
				return null;

			SerializationHintsAttribute hints = new SerializationHintsAttribute();

			hints.Flags = SerializationFlags.FixedType | SerializationFlags.PointerNeverNull;

			return hints;
		}
			private State AdvanceToTheNextElement()
			{
				if(m_array_CurrentPos++ < m_array_LastPos)
				{
					SerializationHintsAttribute hints;

					if(m_value.m_hints != null && (m_value.m_hints.Flags & (SerializationFlags.FixedType | SerializationFlags.PointerNeverNull)) != 0)
					{
						hints = new SerializationHintsAttribute();

						hints.BitPacked = 0;
						hints.Flags = m_value.m_hints.Flags & (SerializationFlags.FixedType | SerializationFlags.PointerNeverNull);
					}
					else
					{
						hints = null;
					}

					return CreateInstance(hints, m_array_ExpectedType);
				}

				return SetValueAndDestroyInstance();
			}
			State CreateInstance(SerializationHintsAttribute hints, Type t)
			{
				State next = new State(m_parent, hints, t);

				m_next = next;
				next.m_prev = this;

				return next;
			}