public void ReadValueInfo(BinarySerializationStreamAnalyzer analyzer)
		{
			MemberInfo junk = new MemberInfo();
			for(int i = 0;i < Slots;i++)
				TypeHelper.GetTypeValue(this, junk, analyzer);
		}
		internal long? ParseRecord(SerialObject parentObject)
		{
			long? serialObjectReferenceID = null;
			if(PendingNullCounter == 0)
			{
				long startPosition = reader.BaseStream.Position;
				SerialObject si = null;
				RecordTypeEnumeration nextRecordType = (RecordTypeEnumeration)reader.ReadByte();
				switch(nextRecordType)
				{
					case RecordTypeEnumeration.SerializedStreamHeader:
						//header is 4 values that I wouldn't know what to do with (what type of message, what version, etc) - trash.
						reader.ReadBytes(16);
						break;
					case RecordTypeEnumeration.ClassWithID:
						//just two ints, read directly
						si = new ClassInfo();
						si.ObjectID = ReadID();
						((ClassInfo)si).ReferencedObject = ReadID();
						//Use the referenced object definition for data retrieval rules
						// -> this will overwrite the original values in the referenced object, but who cares - the values are trash anyway (for now).
						((ClassInfo)SerialObjectsFound[((ClassInfo)si).ReferencedObject.Value]).ReadValueInfo(this);
						break;
					case RecordTypeEnumeration.SystemClassWithMembers:
						//single structure, read in constructor
						si = new ClassInfo(this);
						//also values.
						si.ReadValueInfo(this);
						break;
					case RecordTypeEnumeration.ClassWithMembers:
						//single structure, read in constructor
						si = new ClassInfo(this);
						//also library ID, read into place.
						((ClassInfo)si).LibraryID = ReadID();
						//also values.
						si.ReadValueInfo(this);
						break;
					case RecordTypeEnumeration.SystemClassWithMembersAndTypes:
						//single structure, read in constructor
						si = new ClassInfo(this);
						//also member type info, read into place.
						((ClassInfo)si).ReadTypeInfo(this);
						//also values.
						si.ReadValueInfo(this);
						break;
					case RecordTypeEnumeration.ClassWithMembersAndTypes:
						//single structure, read in constructor
						si = new ClassInfo(this);
						//also member type info, read into place.
						((ClassInfo)si).ReadTypeInfo(this);
						//also library ID, read into place.
						((ClassInfo)si).LibraryID = ReadID();
						//also values.
						si.ReadValueInfo(this);
						break;
					case RecordTypeEnumeration.BinaryObjectString:
						//simple structure, just an ID and a string
						si = new ObjectString();
						si.ObjectID = ReadID();
						((ObjectString)si).String = reader.ReadString();
						break;
					case RecordTypeEnumeration.BinaryArray:
						//complex process, read in constructor.
						si = new BinaryArray(this);
						//also values.
						si.ReadValueInfo(this);
						break;
					case RecordTypeEnumeration.MemberPrimitiveTyped:
						var junk = new MemberInfo();
						junk.BinaryType = BinaryTypeEnumeration.Primitive;
						junk.PrimitiveType = (PrimitiveTypeEnumeration)reader.ReadByte();
						TypeHelper.GetTypeValue(junk, junk, this);
						break;
					case RecordTypeEnumeration.MemberReference:
						//just return the ID that was referenced.
						serialObjectReferenceID = ReadID();
						break;
					case RecordTypeEnumeration.ObjectNull:
						//a single null; do nothing, as null is the default return value.
						break;
					case RecordTypeEnumeration.MessageEnd:
						//do nothing, quit. Wasn't that fun?
						endRecordReached = true;
						break;
					case RecordTypeEnumeration.BinaryLibrary:
						var newLibraryID = ReadID();
						LibrariesFound.Add(newLibraryID, new BinaryLibrary
						{
							LibraryID = newLibraryID,
							Name = reader.ReadString(),
							recordLength = reader.BaseStream.Position - startPosition,
						});
						break;
					case RecordTypeEnumeration.ObjectNullMultiple256:
						//a sequence of nulls; return null, and start a counter to continue returning N nulls over the next calls.
						PendingNullCounter = reader.ReadByte() - 1;
						break;

					case RecordTypeEnumeration.ObjectNullMultiple:
						//a sequence of nulls; return null, and start a counter to continue returning N nulls over the next calls.
						PendingNullCounter = reader.ReadInt32() - 1;
#if (DEBUG)
						//not yet tested: if it happens, take a look around.
						System.Diagnostics.Debugger.Break();
#endif
						break;
					case RecordTypeEnumeration.ArraySinglePrimitive:
						//This one's pretty easy to build, do locally.
						si = new BinaryArray();
						si.ObjectID = ReadID();
						((BinaryArray)si).ArrayType = BinaryArrayTypeEnumeration.Single;
						((BinaryArray)si).BinaryType = BinaryTypeEnumeration.Primitive;
						((BinaryArray)si).Rank = 1;
						((BinaryArray)si).Lengths = new List<int>();
						((BinaryArray)si).Lengths.Add(reader.ReadInt32());
						((BinaryArray)si).PrimitiveType = (PrimitiveTypeEnumeration)reader.ReadByte();
						//and then read the values.
						si.ReadValueInfo(this);
						break;
					case RecordTypeEnumeration.ArraySingleObject:
						//This should be pretty easy to build, do locally.
						si = new BinaryArray();
						si.ObjectID = ReadID();
						((BinaryArray)si).ArrayType = BinaryArrayTypeEnumeration.Single;
						((BinaryArray)si).BinaryType = BinaryTypeEnumeration.Object;
						((BinaryArray)si).Rank = 1;
						((BinaryArray)si).Lengths = new List<int>();
						((BinaryArray)si).Lengths.Add(reader.ReadInt32());
						//and then read the values.
						si.ReadValueInfo(this);
#if (DEBUG)
						//not yet tested: if it happens, take a look around.
						System.Diagnostics.Debugger.Break();
#endif
						break;
					case RecordTypeEnumeration.ArraySingleString:
						//This should be pretty easy to build, do locally.
						si = new BinaryArray();
						si.ObjectID = ReadID();
						((BinaryArray)si).ArrayType = BinaryArrayTypeEnumeration.Single;
						((BinaryArray)si).BinaryType = BinaryTypeEnumeration.String;
						((BinaryArray)si).Rank = 1;
						((BinaryArray)si).Lengths = new List<int>();
						((BinaryArray)si).Lengths.Add(reader.ReadInt32());
						//and then read the values.
						si.ReadValueInfo(this);
#if (DEBUG)
						//not yet tested: if it happens, take a look around.
						System.Diagnostics.Debugger.Break();
#endif
						break;
					case RecordTypeEnumeration.MethodCall:
						//messages/remoting functionality not implemented
						throw new NotImplementedException(nextRecordType.ToString());
					case RecordTypeEnumeration.MethodReturn:
						//messages/remoting functionality not implemented
						throw new NotImplementedException(nextRecordType.ToString());
					default:
						throw new Exception("Parsing appears to have failed dramatically. Unknown record type, we must be lost in the bytestream!");
				}

				//standard: if this was a serial object, add to list and record its length.
				if(si != null)
				{
					SerialObjectsFound.Add(si.ObjectID, si);
					si.recordLength = reader.BaseStream.Position - startPosition;
					if(parentObject != null) si.ParentObjectID = parentObject.ObjectID;
					return si.ObjectID;
				}
			}
			else
				PendingNullCounter--;
			return serialObjectReferenceID;
		}