System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadArray C# (CSharp) Method

ReadArray() private method

private ReadArray ( BinaryHeaderEnum binaryHeaderEnum ) : void
binaryHeaderEnum BinaryHeaderEnum
return void
		private void ReadArray(BinaryHeaderEnum binaryHeaderEnum)
		{
			BinaryAssemblyInfo assemblyInfo = null;
			SerTrace.Log( this, "ReadArray ");
			BinaryArray record = new BinaryArray(binaryHeaderEnum);
			record.Read(this);
#if _DEBUG                        
			record.Dump();

			SerTrace.Log( this, "Read 1 ",((Enum)binaryHeaderEnum).ToString());
#endif
			if (record.binaryTypeEnum == BinaryTypeEnum.ObjectUser)
			{
				if (record.assemId < 1)
					throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_AssemblyId"),record.typeInformation));

				assemblyInfo = (BinaryAssemblyInfo)AssemIdToAssemblyTable[record.assemId];
				SerTrace.Log( this, "ReadArray  lookup assemIdToAssembly assemId ",record.assemId," assembly ",assemblyInfo.assemblyString);                                
			}
			else
				assemblyInfo = SystemAssemblyInfo; //Urt assembly

			ObjectProgress op = GetOp();
			ParseRecord pr = op.pr;

			op.objectTypeEnum = InternalObjectTypeE.Array;
			op.binaryTypeEnum = record.binaryTypeEnum;
			op.typeInformation = record.typeInformation;

			ObjectProgress objectOp = (ObjectProgress)stack.PeekPeek();
			if ((objectOp == null) || (record.objectId > 0))
			{
				// Non-Nested Object
				op.name = "System.Array";
				pr.PRparseTypeEnum = InternalParseTypeE.Object;
				op.memberValueEnum = InternalMemberValueE.Empty;                                    
			}
			else
			{
				// Nested Object			
				pr.PRparseTypeEnum = InternalParseTypeE.Member;
				pr.PRmemberValueEnum = InternalMemberValueE.Nested;
				op.memberValueEnum = InternalMemberValueE.Nested;                       

				switch (objectOp.objectTypeEnum)
				{
				case InternalObjectTypeE.Object:
					pr.PRname = objectOp.name;                                  
					pr.PRmemberTypeEnum = InternalMemberTypeE.Field;
					op.memberTypeEnum = InternalMemberTypeE.Field;                  
					pr.PRkeyDt = objectOp.name;
					pr.PRdtType = objectOp.dtType;
					break;
				case InternalObjectTypeE.Array:
					pr.PRmemberTypeEnum = InternalMemberTypeE.Item;
					op.memberTypeEnum = InternalMemberTypeE.Item;                   
					break;
				default:
					throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_ObjectTypeEnum"),((Enum)objectOp.objectTypeEnum).ToString()));                                              
				}
			}


			pr.PRobjectId = objectReader.GetId((long)record.objectId);
			if (pr.PRobjectId == topId)
				pr.PRobjectPositionEnum = InternalObjectPositionE.Top;
			else if ((headerId > 0) &&(pr.PRobjectId == headerId))
				pr.PRobjectPositionEnum = InternalObjectPositionE.Headers; // Headers are an array of header objects
			else
				pr.PRobjectPositionEnum	= InternalObjectPositionE.Child;

			pr.PRobjectTypeEnum = InternalObjectTypeE.Array;

			BinaryConverter.TypeFromInfo(record.binaryTypeEnum, record.typeInformation, objectReader, assemblyInfo,
										 out pr.PRarrayElementTypeCode, out pr.PRarrayElementTypeString,
										 out pr.PRarrayElementType, out pr.PRisArrayVariant);

			pr.PRdtTypeCode = InternalPrimitiveTypeE.Invalid;


			pr.PRrank = record.rank;
			pr.PRlengthA = record.lengthA;
			pr.PRlowerBoundA = record.lowerBoundA;
			bool isPrimitiveArray = false;

			switch (record.binaryArrayTypeEnum)
			{
			case BinaryArrayTypeEnum.Single:
			case BinaryArrayTypeEnum.SingleOffset:                  
				op.numItems = record.lengthA[0];
				pr.PRarrayTypeEnum = InternalArrayTypeE.Single;
				if (Converter.IsWriteAsByteArray(pr.PRarrayElementTypeCode) &&
					(record.lowerBoundA[0] == 0))
				{
					isPrimitiveArray = true;
					ReadArrayAsBytes(pr);
				}
				break;
			case BinaryArrayTypeEnum.Jagged:
			case BinaryArrayTypeEnum.JaggedOffset:                  
				op.numItems = record.lengthA[0];
				pr.PRarrayTypeEnum = InternalArrayTypeE.Jagged;                 
				break;
			case BinaryArrayTypeEnum.Rectangular:
			case BinaryArrayTypeEnum.RectangularOffset:                 
				int arrayLength = 1;
				for (int i=0; i<record.rank; i++)
					arrayLength = arrayLength*record.lengthA[i];
				op.numItems = arrayLength;
				pr.PRarrayTypeEnum = InternalArrayTypeE.Rectangular;                                        
				break;
			default:
				throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_ArrayType"),((Enum)record.binaryArrayTypeEnum).ToString()));
			}

			if (!isPrimitiveArray)
				stack.Push(op);
			else
			{
				PutOp(op);
			}

			SerTrace.Log( this, "ReadArray ",((Enum)record.binaryArrayTypeEnum).ToString()," length ",op.numItems);             
			objectReader.Parse(pr);

			if (isPrimitiveArray)
			{
				pr.PRparseTypeEnum = InternalParseTypeE.ObjectEnd;
				objectReader.Parse(pr);
			}
		}