private void ReadObjectNull(BinaryHeaderEnum binaryHeaderEnum)
        {
            SerTrace.Log(this, "ReadObjectNull ");

            if (objectNull == null)
            {
                objectNull = new ObjectNull();
            }

            objectNull.Read(this, binaryHeaderEnum);
            objectNull.Dump();

            ObjectProgress objectOp = (ObjectProgress)stack.Peek();

            prs.Init();
            prs.PRparseTypeEnum   = InternalParseTypeE.Member;
            prs.PRmemberValueEnum = InternalMemberValueE.Null;

            if (objectOp.objectTypeEnum == InternalObjectTypeE.Object)
            {
                prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
                prs.PRname           = objectOp.name;
                prs.PRdtType         = objectOp.dtType;
            }
            else
            {
                prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
                prs.PRnullCount      = objectNull.nullCount;
                //only one null position has been incremented by GetNext
                //The position needs to be reset for the rest of the nulls
                objectOp.ArrayCountIncrement(objectNull.nullCount - 1);
            }
            objectReader.Parse(prs);
        }
示例#2
0
        private void ReadMemberPrimitiveUnTyped()
        {
            ObjectProgress objectProgress = (ObjectProgress)this.stack.Peek();

            if (this.memberPrimitiveUnTyped == null)
            {
                this.memberPrimitiveUnTyped = new MemberPrimitiveUnTyped();
            }
            this.memberPrimitiveUnTyped.Set((InternalPrimitiveTypeE)this.expectedTypeInformation);
            this.memberPrimitiveUnTyped.Read(this);
            this.memberPrimitiveUnTyped.Dump();
            this.prs.Init();
            this.prs.PRvarValue        = this.memberPrimitiveUnTyped.value;
            this.prs.PRdtTypeCode      = (InternalPrimitiveTypeE)this.expectedTypeInformation;
            this.prs.PRdtType          = Converter.ToType(this.prs.PRdtTypeCode);
            this.prs.PRparseTypeEnum   = InternalParseTypeE.Member;
            this.prs.PRmemberValueEnum = InternalMemberValueE.InlineValue;
            if (objectProgress.objectTypeEnum == InternalObjectTypeE.Object)
            {
                this.prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
                this.prs.PRname           = objectProgress.name;
            }
            else
            {
                this.prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
            }
            this.objectReader.Parse(this.prs);
        }
        private void ReadMemberPrimitiveUnTyped()
        {
            SerTrace.Log(this, "ReadMemberPrimitiveUnTyped ");
            ObjectProgress objectOp = (ObjectProgress)stack.Peek();

            if (memberPrimitiveUnTyped == null)
            {
                memberPrimitiveUnTyped = new MemberPrimitiveUnTyped();
            }
            memberPrimitiveUnTyped.Set((InternalPrimitiveTypeE)expectedTypeInformation);
            memberPrimitiveUnTyped.Read(this);
            memberPrimitiveUnTyped.Dump();

            prs.Init();
            prs.PRvarValue = memberPrimitiveUnTyped.value;

            prs.PRdtTypeCode      = (InternalPrimitiveTypeE)expectedTypeInformation;
            prs.PRdtType          = Converter.ToType(prs.PRdtTypeCode);
            prs.PRparseTypeEnum   = InternalParseTypeE.Member;
            prs.PRmemberValueEnum = InternalMemberValueE.InlineValue;

            if (objectOp.objectTypeEnum == InternalObjectTypeE.Object)
            {
                prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
                prs.PRname           = objectOp.name;
            }
            else
            {
                prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
            }

            objectReader.Parse(prs);
        }
        private void ReadMemberReference()
        {
            SerTrace.Log(this, "ReadMemberReference ");

            if (memberReference == null)
            {
                memberReference = new MemberReference();
            }
            memberReference.Read(this);
            memberReference.Dump();

            ObjectProgress objectOp = (ObjectProgress)stack.Peek();

            prs.Init();
            prs.PRidRef           = objectReader.GetId((long)memberReference.idRef);
            prs.PRparseTypeEnum   = InternalParseTypeE.Member;
            prs.PRmemberValueEnum = InternalMemberValueE.Reference;

            if (objectOp.objectTypeEnum == InternalObjectTypeE.Object)
            {
                prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
                prs.PRname           = objectOp.name;
                prs.PRdtType         = objectOp.dtType;
            }
            else
            {
                prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
            }


            objectReader.Parse(prs);
        }
示例#5
0
        private void ReadMemberPrimitiveUnTyped()
        {
            ObjectProgress objectOp = (ObjectProgress)_stack.Peek();

            if (memberPrimitiveUnTyped == null)
            {
                memberPrimitiveUnTyped = new MemberPrimitiveUnTyped();
            }
            memberPrimitiveUnTyped.Set((InternalPrimitiveTypeE)_expectedTypeInformation);
            memberPrimitiveUnTyped.Read(this);

            PRs.Init();
            PRs._varValue = memberPrimitiveUnTyped._value;

            PRs._dtTypeCode      = (InternalPrimitiveTypeE)_expectedTypeInformation;
            PRs._dtType          = Converter.ToType(PRs._dtTypeCode);
            PRs._parseTypeEnum   = InternalParseTypeE.Member;
            PRs._memberValueEnum = InternalMemberValueE.InlineValue;

            if (objectOp._objectTypeEnum == InternalObjectTypeE.Object)
            {
                PRs._memberTypeEnum = InternalMemberTypeE.Field;
                PRs._name           = objectOp._name;
            }
            else
            {
                PRs._memberTypeEnum = InternalMemberTypeE.Item;
            }

            _objectReader.Parse(PRs);
        }
示例#6
0
        private void ReadMemberReference()
        {
            if (this.memberReference == null)
            {
                this.memberReference = new MemberReference();
            }
            this.memberReference.Read(this);
            this.memberReference.Dump();
            ObjectProgress objectProgress = (ObjectProgress)this.stack.Peek();

            this.prs.Init();
            this.prs.PRidRef           = this.objectReader.GetId((long)this.memberReference.idRef);
            this.prs.PRparseTypeEnum   = InternalParseTypeE.Member;
            this.prs.PRmemberValueEnum = InternalMemberValueE.Reference;
            if (objectProgress.objectTypeEnum == InternalObjectTypeE.Object)
            {
                this.prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
                this.prs.PRname           = objectProgress.name;
                this.prs.PRdtType         = objectProgress.dtType;
            }
            else
            {
                this.prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
            }
            this.objectReader.Parse(this.prs);
        }
示例#7
0
        private void ReadObjectNull(BinaryHeaderEnum binaryHeaderEnum)
        {
            if (this.objectNull == null)
            {
                this.objectNull = new ObjectNull();
            }
            this.objectNull.Read(this, binaryHeaderEnum);
            this.objectNull.Dump();
            ObjectProgress objectProgress = (ObjectProgress)this.stack.Peek();

            this.prs.Init();
            this.prs.PRparseTypeEnum   = InternalParseTypeE.Member;
            this.prs.PRmemberValueEnum = InternalMemberValueE.Null;
            if (objectProgress.objectTypeEnum == InternalObjectTypeE.Object)
            {
                this.prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
                this.prs.PRname           = objectProgress.name;
                this.prs.PRdtType         = objectProgress.dtType;
            }
            else
            {
                this.prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
                this.prs.PRnullCount      = this.objectNull.nullCount;
                objectProgress.ArrayCountIncrement(this.objectNull.nullCount - 1);
            }
            this.objectReader.Parse(this.prs);
        }
示例#8
0
        private void ReadObjectNull(BinaryHeaderEnum binaryHeaderEnum)
        {
            if (_objectNull == null)
            {
                _objectNull = new ObjectNull();
            }
            _objectNull.Read(this, binaryHeaderEnum);

            ObjectProgress objectOp = (ObjectProgress)_stack.Peek();

            PRs.Init();
            PRs._parseTypeEnum   = InternalParseTypeE.Member;
            PRs._memberValueEnum = InternalMemberValueE.Null;

            if (objectOp._objectTypeEnum == InternalObjectTypeE.Object)
            {
                PRs._memberTypeEnum = InternalMemberTypeE.Field;
                PRs._name           = objectOp._name;
                PRs._dtType         = objectOp._dtType;
            }
            else
            {
                PRs._memberTypeEnum = InternalMemberTypeE.Item;
                PRs._consecutiveNullArrayEntryCount = _objectNull._nullCount;
                //only one null position has been incremented by GetNext
                //The position needs to be reset for the rest of the nulls
                objectOp.ArrayCountIncrement(_objectNull._nullCount - 1);
            }
            _objectReader.Parse(PRs);
        }
示例#9
0
        private void ReadMemberReference()
        {
            if (_memberReference == null)
            {
                _memberReference = new MemberReference();
            }
            _memberReference.Read(this);

            ObjectProgress objectOp = (ObjectProgress)_stack.Peek();

            PRs.Init();
            PRs._idRef           = _objectReader.GetId(_memberReference._idRef);
            PRs._parseTypeEnum   = InternalParseTypeE.Member;
            PRs._memberValueEnum = InternalMemberValueE.Reference;

            if (objectOp._objectTypeEnum == InternalObjectTypeE.Object)
            {
                PRs._memberTypeEnum = InternalMemberTypeE.Field;
                PRs._name           = objectOp._name;
                PRs._dtType         = objectOp._dtType;
            }
            else
            {
                PRs._memberTypeEnum = InternalMemberTypeE.Item;
            }

            _objectReader.Parse(PRs);
        }
 private void PutOp(ObjectProgress op)
 {
     if (this.opPool == null)
     {
         this.opPool = new SerStack("opPool");
     }
     this.opPool.Push(op);
 }
示例#11
0
 private void PutOp(ObjectProgress op)
 {
     if (this.opPool == null)
     {
         this.opPool = new SerStack("opPool");
     }
     this.opPool.Push((object)op);
 }
示例#12
0
 private void PutOp(ObjectProgress op)
 {
     if (_opPool == null)
     {
         _opPool = new SerStack("opPool");
     }
     _opPool.Push(op);
 }
示例#13
0
        private void ReadMemberPrimitiveTyped()
        {
            SerTrace.Log(this, "ReadObjectPrimitive");

            if (memberPrimitiveTyped == null)
            {
                memberPrimitiveTyped = new MemberPrimitiveTyped();
            }

            memberPrimitiveTyped.Read(this);
            memberPrimitiveTyped.Dump();

            prs.PRobjectTypeEnum = InternalObjectTypeE.Object;             //Get rid of
            ObjectProgress objectOp = (ObjectProgress)stack.Peek();

            prs.Init();
            prs.PRvarValue   = memberPrimitiveTyped.value;
            prs.PRkeyDt      = Converter.ToComType(memberPrimitiveTyped.primitiveTypeEnum);
            prs.PRdtType     = Converter.ToType(memberPrimitiveTyped.primitiveTypeEnum);
            prs.PRdtTypeCode = memberPrimitiveTyped.primitiveTypeEnum;

            if (objectOp == null)
            {
                // Top level boxed primitive
                SerTrace.Log(this, "ReadObjectPrimitive, Non-Nested");
                prs.PRparseTypeEnum = InternalParseTypeE.Object;
                prs.PRname          = "System.Variant";
            }
            else
            {
                // Nested in an Object
                SerTrace.Log(this, "ReadObjectPrimitive, Nested");

                prs.PRparseTypeEnum   = InternalParseTypeE.Member;
                prs.PRmemberValueEnum = InternalMemberValueE.InlineValue;

                switch (objectOp.objectTypeEnum)
                {
                case InternalObjectTypeE.Object:
                    prs.PRname           = objectOp.name;
                    prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
                    break;

                case InternalObjectTypeE.Array:
                    prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
                    break;

                default:
                    throw new SerializationException(String.Format(Environment.GetResourceString("Serialization_ObjectTypeEnum"), ((Enum)objectOp.objectTypeEnum).ToString()));
                }
            }

            objectReader.Parse(prs);
        }
        private ObjectProgress GetOp()
        {
            ObjectProgress progress = null;

            if ((this.opPool != null) && !this.opPool.IsEmpty())
            {
                progress = (ObjectProgress)this.opPool.Pop();
                progress.Init();
                return(progress);
            }
            return(new ObjectProgress());
        }
示例#15
0
        private ObjectProgress GetOp()
        {
            ObjectProgress objectProgress;

            if (this.opPool != null && !this.opPool.IsEmpty())
            {
                objectProgress = (ObjectProgress)this.opPool.Pop();
                objectProgress.Init();
            }
            else
            {
                objectProgress = new ObjectProgress();
            }
            return(objectProgress);
        }
示例#16
0
        private void ReadMemberPrimitiveTyped()
        {
            if (_memberPrimitiveTyped == null)
            {
                _memberPrimitiveTyped = new MemberPrimitiveTyped();
            }
            _memberPrimitiveTyped.Read(this);

            PRs._objectTypeEnum = InternalObjectTypeE.Object; //Get rid of
            ObjectProgress objectOp = (ObjectProgress)_stack.Peek();

            PRs.Init();
            PRs._varValue   = _memberPrimitiveTyped._value;
            PRs._keyDt      = Converter.ToComType(_memberPrimitiveTyped._primitiveTypeEnum);
            PRs._dtType     = Converter.ToType(_memberPrimitiveTyped._primitiveTypeEnum);
            PRs._dtTypeCode = _memberPrimitiveTyped._primitiveTypeEnum;

            if (objectOp == null)
            {
                // Top level boxed primitive
                PRs._parseTypeEnum = InternalParseTypeE.Object;
                PRs._name          = "System.Variant";
            }
            else
            {
                // Nested in an Object

                PRs._parseTypeEnum   = InternalParseTypeE.Member;
                PRs._memberValueEnum = InternalMemberValueE.InlineValue;

                switch (objectOp._objectTypeEnum)
                {
                case InternalObjectTypeE.Object:
                    PRs._name           = objectOp._name;
                    PRs._memberTypeEnum = InternalMemberTypeE.Field;
                    break;

                case InternalObjectTypeE.Array:
                    PRs._memberTypeEnum = InternalMemberTypeE.Item;
                    break;

                default:
                    throw new SerializationException(SR.Format(SR.Serialization_ObjectTypeEnum, objectOp._objectTypeEnum.ToString()));
                }
            }

            _objectReader.Parse(PRs);
        }
示例#17
0
        private ObjectProgress GetOp()
        {
            ObjectProgress op = null;

            if (_opPool != null && !_opPool.IsEmpty())
            {
                op = (ObjectProgress)_opPool.Pop();
                op.Init();
            }
            else
            {
                op = new ObjectProgress();
            }

            return(op);
        }
示例#18
0
        private void ReadMemberPrimitiveTyped()
        {
            if (this.memberPrimitiveTyped == null)
            {
                this.memberPrimitiveTyped = new MemberPrimitiveTyped();
            }
            this.memberPrimitiveTyped.Read(this);
            this.memberPrimitiveTyped.Dump();
            this.prs.PRobjectTypeEnum = InternalObjectTypeE.Object;
            ObjectProgress objectProgress = (ObjectProgress)this.stack.Peek();

            this.prs.Init();
            this.prs.PRvarValue   = this.memberPrimitiveTyped.value;
            this.prs.PRkeyDt      = Converter.ToComType(this.memberPrimitiveTyped.primitiveTypeEnum);
            this.prs.PRdtType     = Converter.ToType(this.memberPrimitiveTyped.primitiveTypeEnum);
            this.prs.PRdtTypeCode = this.memberPrimitiveTyped.primitiveTypeEnum;
            if (objectProgress == null)
            {
                this.prs.PRparseTypeEnum = InternalParseTypeE.Object;
                this.prs.PRname          = "System.Variant";
            }
            else
            {
                this.prs.PRparseTypeEnum   = InternalParseTypeE.Member;
                this.prs.PRmemberValueEnum = InternalMemberValueE.InlineValue;
                switch (objectProgress.objectTypeEnum)
                {
                case InternalObjectTypeE.Object:
                    this.prs.PRname           = objectProgress.name;
                    this.prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
                    break;

                case InternalObjectTypeE.Array:
                    this.prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
                    break;

                default:
                    throw new SerializationException(Environment.GetResourceString("Serialization_ObjectTypeEnum", (object)objectProgress.objectTypeEnum.ToString()));
                }
            }
            this.objectReader.Parse(this.prs);
        }
        private void ReadObjectWithMap(BinaryObjectWithMap record)
        {
            BinaryAssemblyInfo assemblyInfo = null;
            ObjectProgress     op           = this.GetOp();
            ParseRecord        pr           = op.pr;

            this.stack.Push(op);
            if (record.binaryHeaderEnum == BinaryHeaderEnum.ObjectWithMapAssemId)
            {
                if (record.assemId < 1)
                {
                    throw new SerializationException(Environment.GetResourceString("Serialization_Assembly", new object[] { record.name }));
                }
                assemblyInfo = (BinaryAssemblyInfo)this.AssemIdToAssemblyTable[record.assemId];
                if (assemblyInfo == null)
                {
                    throw new SerializationException(Environment.GetResourceString("Serialization_Assembly", new object[] { record.assemId + " " + record.name }));
                }
            }
            else if (record.binaryHeaderEnum == BinaryHeaderEnum.ObjectWithMap)
            {
                assemblyInfo = this.SystemAssemblyInfo;
            }
            Type      objectType = this.objectReader.GetType(assemblyInfo, record.name);
            ObjectMap map        = ObjectMap.Create(record.name, objectType, record.memberNames, this.objectReader, record.objectId, assemblyInfo);

            this.ObjectMapIdTable[record.objectId] = map;
            op.objectTypeEnum   = InternalObjectTypeE.Object;
            op.binaryTypeEnumA  = map.binaryTypeEnumA;
            op.typeInformationA = map.typeInformationA;
            op.memberLength     = op.binaryTypeEnumA.Length;
            op.memberNames      = map.memberNames;
            op.memberTypes      = map.memberTypes;
            ObjectProgress progress2 = (ObjectProgress)this.stack.PeekPeek();

            if ((progress2 == null) || progress2.isInitial)
            {
                op.name            = record.name;
                pr.PRparseTypeEnum = InternalParseTypeE.Object;
                op.memberValueEnum = InternalMemberValueE.Empty;
            }
            else
            {
                pr.PRparseTypeEnum   = InternalParseTypeE.Member;
                pr.PRmemberValueEnum = InternalMemberValueE.Nested;
                op.memberValueEnum   = InternalMemberValueE.Nested;
                switch (progress2.objectTypeEnum)
                {
                case InternalObjectTypeE.Object:
                    pr.PRname           = progress2.name;
                    pr.PRmemberTypeEnum = InternalMemberTypeE.Field;
                    op.memberTypeEnum   = InternalMemberTypeE.Field;
                    goto Label_0213;

                case InternalObjectTypeE.Array:
                    pr.PRmemberTypeEnum = InternalMemberTypeE.Item;
                    op.memberTypeEnum   = InternalMemberTypeE.Field;
                    goto Label_0213;
                }
                throw new SerializationException(Environment.GetResourceString("Serialization_ObjectTypeEnum", new object[] { progress2.objectTypeEnum.ToString() }));
            }
Label_0213:
            pr.PRobjectTypeEnum = InternalObjectTypeE.Object;
            pr.PRobjectId       = this.objectReader.GetId((long)record.objectId);
            pr.PRobjectInfo     = map.CreateObjectInfo(ref pr.PRsi, ref pr.PRmemberData);
            if (pr.PRobjectId == this.topId)
            {
                pr.PRobjectPositionEnum = InternalObjectPositionE.Top;
            }
            pr.PRkeyDt      = record.name;
            pr.PRdtType     = map.objectType;
            pr.PRdtTypeCode = InternalPrimitiveTypeE.Invalid;
            this.objectReader.Parse(pr);
        }
示例#20
0
        private void ReadArray(BinaryHeaderEnum binaryHeaderEnum)
        {
            BinaryAssemblyInfo assemblyInfo = null;
            BinaryArray        record       = new BinaryArray(binaryHeaderEnum);

            record.Read(this);

            if (record._binaryTypeEnum == BinaryTypeEnum.ObjectUser)
            {
                if (record._assemId < 1)
                {
                    throw new SerializationException(SR.Format(SR.Serialization_AssemblyId, record._typeInformation));
                }
                assemblyInfo = (BinaryAssemblyInfo)AssemIdToAssemblyTable[record._assemId];
            }
            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._parseTypeEnum   = InternalParseTypeE.Object;
                op._memberValueEnum = InternalMemberValueE.Empty;
            }
            else
            {
                // Nested Object
                pr._parseTypeEnum   = InternalParseTypeE.Member;
                pr._memberValueEnum = InternalMemberValueE.Nested;
                op._memberValueEnum = InternalMemberValueE.Nested;

                switch (objectOp._objectTypeEnum)
                {
                case InternalObjectTypeE.Object:
                    pr._name           = objectOp._name;
                    pr._memberTypeEnum = InternalMemberTypeE.Field;
                    op._memberTypeEnum = InternalMemberTypeE.Field;
                    pr._keyDt          = objectOp._name;
                    pr._dtType         = objectOp._dtType;
                    break;

                case InternalObjectTypeE.Array:
                    pr._memberTypeEnum = InternalMemberTypeE.Item;
                    op._memberTypeEnum = InternalMemberTypeE.Item;
                    break;

                default:
                    throw new SerializationException(SR.Format(SR.Serialization_ObjectTypeEnum, objectOp._objectTypeEnum.ToString()));
                }
            }

            pr._objectId = _objectReader.GetId(record._objectId);
            if (pr._objectId == _topId)
            {
                pr._objectPositionEnum = InternalObjectPositionE.Top;
            }
            else if ((_headerId > 0) && (pr._objectId == _headerId))
            {
                pr._objectPositionEnum = InternalObjectPositionE.Headers; // Headers are an array of header objects
            }
            else
            {
                pr._objectPositionEnum = InternalObjectPositionE.Child;
            }

            pr._objectTypeEnum = InternalObjectTypeE.Array;

            BinaryTypeConverter.TypeFromInfo(record._binaryTypeEnum, record._typeInformation, _objectReader, assemblyInfo,
                                             out pr._arrayElementTypeCode, out pr._arrayElementTypeString,
                                             out pr._arrayElementType, out pr._isArrayVariant);

            pr._dtTypeCode = InternalPrimitiveTypeE.Invalid;

            pr._rank        = record._rank;
            pr._lengthA     = record._lengthA;
            pr._lowerBoundA = record._lowerBoundA;
            bool isPrimitiveArray = false;

            switch (record._binaryArrayTypeEnum)
            {
            case BinaryArrayTypeEnum.Single:
            case BinaryArrayTypeEnum.SingleOffset:
                op._numItems      = record._lengthA[0];
                pr._arrayTypeEnum = InternalArrayTypeE.Single;
                if (Converter.IsWriteAsByteArray(pr._arrayElementTypeCode) &&
                    (record._lowerBoundA[0] == 0))
                {
                    isPrimitiveArray = true;
                    ReadArrayAsBytes(pr);
                }
                break;

            case BinaryArrayTypeEnum.Jagged:
            case BinaryArrayTypeEnum.JaggedOffset:
                op._numItems      = record._lengthA[0];
                pr._arrayTypeEnum = 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._arrayTypeEnum = InternalArrayTypeE.Rectangular;
                break;

            default:
                throw new SerializationException(SR.Format(SR.Serialization_ArrayType, record._binaryArrayTypeEnum.ToString()));
            }

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

            _objectReader.Parse(pr);

            if (isPrimitiveArray)
            {
                pr._parseTypeEnum = InternalParseTypeE.ObjectEnd;
                _objectReader.Parse(pr);
            }
        }
示例#21
0
        // Parse the input
        // Reads each record from the input stream. If the record is a primitive type (A number)
        //  then it doesn't have a BinaryHeaderEnum byte. For this case the expected type
        //  has been previously set to Primitive
        internal void Run()
        {
            try
            {
                bool isLoop = true;
                ReadBegin();
                ReadSerializationHeaderRecord();
                while (isLoop)
                {
                    BinaryHeaderEnum binaryHeaderEnum = BinaryHeaderEnum.Object;
                    switch (_expectedType)
                    {
                    case BinaryTypeEnum.ObjectUrt:
                    case BinaryTypeEnum.ObjectUser:
                    case BinaryTypeEnum.String:
                    case BinaryTypeEnum.Object:
                    case BinaryTypeEnum.ObjectArray:
                    case BinaryTypeEnum.StringArray:
                    case BinaryTypeEnum.PrimitiveArray:
                        byte inByte = _dataReader.ReadByte();
                        binaryHeaderEnum = (BinaryHeaderEnum)inByte;
                        switch (binaryHeaderEnum)
                        {
                        case BinaryHeaderEnum.Assembly:
                        case BinaryHeaderEnum.CrossAppDomainAssembly:
                            ReadAssembly(binaryHeaderEnum);
                            break;

                        case BinaryHeaderEnum.Object:
                            ReadObject();
                            break;

                        case BinaryHeaderEnum.CrossAppDomainMap:
                            ReadCrossAppDomainMap();
                            break;

                        case BinaryHeaderEnum.ObjectWithMap:
                        case BinaryHeaderEnum.ObjectWithMapAssemId:
                            ReadObjectWithMap(binaryHeaderEnum);
                            break;

                        case BinaryHeaderEnum.ObjectWithMapTyped:
                        case BinaryHeaderEnum.ObjectWithMapTypedAssemId:
                            ReadObjectWithMapTyped(binaryHeaderEnum);
                            break;

                        case BinaryHeaderEnum.ObjectString:
                        case BinaryHeaderEnum.CrossAppDomainString:
                            ReadObjectString(binaryHeaderEnum);
                            break;

                        case BinaryHeaderEnum.Array:
                        case BinaryHeaderEnum.ArraySinglePrimitive:
                        case BinaryHeaderEnum.ArraySingleObject:
                        case BinaryHeaderEnum.ArraySingleString:
                            ReadArray(binaryHeaderEnum);
                            break;

                        case BinaryHeaderEnum.MemberPrimitiveTyped:
                            ReadMemberPrimitiveTyped();
                            break;

                        case BinaryHeaderEnum.MemberReference:
                            ReadMemberReference();
                            break;

                        case BinaryHeaderEnum.ObjectNull:
                        case BinaryHeaderEnum.ObjectNullMultiple256:
                        case BinaryHeaderEnum.ObjectNullMultiple:
                            ReadObjectNull(binaryHeaderEnum);
                            break;

                        case BinaryHeaderEnum.MessageEnd:
                            isLoop = false;
                            ReadMessageEnd();
                            ReadEnd();
                            break;

                        default:
                            throw new SerializationException(SR.Format(SR.Serialization_BinaryHeader, inByte));
                        }
                        break;

                    case BinaryTypeEnum.Primitive:
                        ReadMemberPrimitiveUnTyped();
                        break;

                    default:
                        throw new SerializationException(SR.Serialization_TypeExpected);
                    }

                    // If an assembly is encountered, don't advance
                    // object Progress,
                    if (binaryHeaderEnum != BinaryHeaderEnum.Assembly)
                    {
                        // End of parse loop.
                        bool isData = false;

                        // Set up loop for next iteration.
                        // If this is an object, and the end of object has been reached, then parse object end.
                        while (!isData)
                        {
                            ObjectProgress op = (ObjectProgress)_stack.Peek();
                            if (op == null)
                            {
                                // No more object on stack, then the next record is a top level object
                                _expectedType            = BinaryTypeEnum.ObjectUrt;
                                _expectedTypeInformation = null;
                                isData = true;
                            }
                            else
                            {
                                // Find out what record is expected next
                                isData                   = op.GetNext(out op._expectedType, out op._expectedTypeInformation);
                                _expectedType            = op._expectedType;
                                _expectedTypeInformation = op._expectedTypeInformation;

                                if (!isData)
                                {
                                    // No record is expected next, this is the end of an object or array
                                    PRs.Init();
                                    if (op._memberValueEnum == InternalMemberValueE.Nested)
                                    {
                                        // Nested object
                                        PRs._parseTypeEnum   = InternalParseTypeE.MemberEnd;
                                        PRs._memberTypeEnum  = op._memberTypeEnum;
                                        PRs._memberValueEnum = op._memberValueEnum;
                                        _objectReader.Parse(PRs);
                                    }
                                    else
                                    {
                                        // Top level object
                                        PRs._parseTypeEnum   = InternalParseTypeE.ObjectEnd;
                                        PRs._memberTypeEnum  = op._memberTypeEnum;
                                        PRs._memberValueEnum = op._memberValueEnum;
                                        _objectReader.Parse(PRs);
                                    }
                                    _stack.Pop();
                                    PutOp(op);
                                }
                            }
                        }
                    }
                }
            }
            catch (EndOfStreamException)
            {
                // EOF should never be thrown since there is a MessageEnd record to stop parsing
                throw new SerializationException(SR.Serialization_StreamEnd);
            }
        }
示例#22
0
        private void ReadObjectString(BinaryHeaderEnum binaryHeaderEnum)
        {
            if (_objectString == null)
            {
                _objectString = new BinaryObjectString();
            }

            if (binaryHeaderEnum == BinaryHeaderEnum.ObjectString)
            {
                _objectString.Read(this);
            }
            else
            {
                if (_crossAppDomainString == null)
                {
                    _crossAppDomainString = new BinaryCrossAppDomainString();
                }
                _crossAppDomainString.Read(this);
                _objectString._value = _objectReader.CrossAppDomainArray(_crossAppDomainString._value) as string;
                if (_objectString._value == null)
                {
                    throw new SerializationException(SR.Format(SR.Serialization_CrossAppDomainError, "String", _crossAppDomainString._value));
                }

                _objectString._objectId = _crossAppDomainString._objectId;
            }

            PRs.Init();
            PRs._parseTypeEnum = InternalParseTypeE.Object;
            PRs._objectId      = _objectReader.GetId(_objectString._objectId);

            if (PRs._objectId == _topId)
            {
                PRs._objectPositionEnum = InternalObjectPositionE.Top;
            }

            PRs._objectTypeEnum = InternalObjectTypeE.Object;

            ObjectProgress objectOp = (ObjectProgress)_stack.Peek();

            PRs._value      = _objectString._value;
            PRs._keyDt      = "System.String";
            PRs._dtType     = Converter.s_typeofString;
            PRs._dtTypeCode = InternalPrimitiveTypeE.Invalid;
            PRs._varValue   = _objectString._value; //Need to set it because ObjectReader is picking up value from variant, not pr.PRvalue

            if (objectOp == null)
            {
                // Top level String
                PRs._parseTypeEnum = InternalParseTypeE.Object;
                PRs._name          = "System.String";
            }
            else
            {
                // Nested in an Object

                PRs._parseTypeEnum   = InternalParseTypeE.Member;
                PRs._memberValueEnum = InternalMemberValueE.InlineValue;

                switch (objectOp._objectTypeEnum)
                {
                case InternalObjectTypeE.Object:
                    PRs._name           = objectOp._name;
                    PRs._memberTypeEnum = InternalMemberTypeE.Field;
                    break;

                case InternalObjectTypeE.Array:
                    PRs._memberTypeEnum = InternalMemberTypeE.Item;
                    break;

                default:
                    throw new SerializationException(SR.Format(SR.Serialization_ObjectTypeEnum, objectOp._objectTypeEnum.ToString()));
                }
            }

            _objectReader.Parse(PRs);
        }
示例#23
0
        private void ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)
        {
            BinaryAssemblyInfo assemblyInfo = null;
            ObjectProgress     op           = GetOp();
            ParseRecord        pr           = op._pr;

            _stack.Push(op);

            if (record._binaryHeaderEnum == BinaryHeaderEnum.ObjectWithMapTypedAssemId)
            {
                if (record._assemId < 1)
                {
                    throw new SerializationException(SR.Format(SR.Serialization_AssemblyId, record._name));
                }

                assemblyInfo = (BinaryAssemblyInfo)AssemIdToAssemblyTable[record._assemId];
                if (assemblyInfo == null)
                {
                    throw new SerializationException(SR.Format(SR.Serialization_AssemblyId, record._assemId + " " + record._name));
                }
            }
            else if (record._binaryHeaderEnum == BinaryHeaderEnum.ObjectWithMapTyped)
            {
                assemblyInfo = SystemAssemblyInfo; // Urt assembly
            }

            ObjectMap objectMap = ObjectMap.Create(record._name, record._memberNames, record._binaryTypeEnumA, record._typeInformationA, record._memberAssemIds, _objectReader, record._objectId, assemblyInfo, AssemIdToAssemblyTable);

            ObjectMapIdTable[record._objectId] = objectMap;
            op._objectTypeEnum   = InternalObjectTypeE.Object;
            op._binaryTypeEnumA  = objectMap._binaryTypeEnumA;
            op._typeInformationA = objectMap._typeInformationA;
            op._memberLength     = op._binaryTypeEnumA.Length;
            op._memberNames      = objectMap._memberNames;
            op._memberTypes      = objectMap._memberTypes;

            ObjectProgress objectOp = (ObjectProgress)_stack.PeekPeek();

            if ((objectOp == null) || (objectOp._isInitial))
            {
                // Non-Nested Object
                op._name            = record._name;
                pr._parseTypeEnum   = InternalParseTypeE.Object;
                op._memberValueEnum = InternalMemberValueE.Empty;
            }
            else
            {
                // Nested Object
                pr._parseTypeEnum   = InternalParseTypeE.Member;
                pr._memberValueEnum = InternalMemberValueE.Nested;
                op._memberValueEnum = InternalMemberValueE.Nested;

                switch (objectOp._objectTypeEnum)
                {
                case InternalObjectTypeE.Object:
                    pr._name           = objectOp._name;
                    pr._memberTypeEnum = InternalMemberTypeE.Field;
                    op._memberTypeEnum = InternalMemberTypeE.Field;
                    break;

                case InternalObjectTypeE.Array:
                    pr._memberTypeEnum = InternalMemberTypeE.Item;
                    op._memberTypeEnum = InternalMemberTypeE.Item;
                    break;

                default:
                    throw new SerializationException(SR.Format(SR.Serialization_ObjectTypeEnum, objectOp._objectTypeEnum.ToString()));
                }
            }

            pr._objectTypeEnum = InternalObjectTypeE.Object;
            pr._objectInfo     = objectMap.CreateObjectInfo(ref pr._si, ref pr._memberData);
            pr._objectId       = _objectReader.GetId(record._objectId);
            if (pr._objectId == _topId)
            {
                pr._objectPositionEnum = InternalObjectPositionE.Top;
            }
            pr._keyDt      = record._name;
            pr._dtType     = objectMap._objectType;
            pr._dtTypeCode = InternalPrimitiveTypeE.Invalid;
            _objectReader.Parse(pr);
        }
示例#24
0
        private void ReadObject()
        {
            if (_binaryObject == null)
            {
                _binaryObject = new BinaryObject();
            }
            _binaryObject.Read(this);

            ObjectMap objectMap = (ObjectMap)ObjectMapIdTable[_binaryObject._mapId];

            if (objectMap == null)
            {
                throw new SerializationException(SR.Format(SR.Serialization_Map, _binaryObject._mapId));
            }

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

            _stack.Push(op);

            op._objectTypeEnum   = InternalObjectTypeE.Object;
            op._binaryTypeEnumA  = objectMap._binaryTypeEnumA;
            op._memberNames      = objectMap._memberNames;
            op._memberTypes      = objectMap._memberTypes;
            op._typeInformationA = objectMap._typeInformationA;
            op._memberLength     = op._binaryTypeEnumA.Length;
            ObjectProgress objectOp = (ObjectProgress)_stack.PeekPeek();

            if ((objectOp == null) || (objectOp._isInitial))
            {
                // Non-Nested Object
                op._name            = objectMap._objectName;
                pr._parseTypeEnum   = InternalParseTypeE.Object;
                op._memberValueEnum = InternalMemberValueE.Empty;
            }
            else
            {
                // Nested Object
                pr._parseTypeEnum   = InternalParseTypeE.Member;
                pr._memberValueEnum = InternalMemberValueE.Nested;
                op._memberValueEnum = InternalMemberValueE.Nested;

                switch (objectOp._objectTypeEnum)
                {
                case InternalObjectTypeE.Object:
                    pr._name           = objectOp._name;
                    pr._memberTypeEnum = InternalMemberTypeE.Field;
                    op._memberTypeEnum = InternalMemberTypeE.Field;
                    break;

                case InternalObjectTypeE.Array:
                    pr._memberTypeEnum = InternalMemberTypeE.Item;
                    op._memberTypeEnum = InternalMemberTypeE.Item;
                    break;

                default:
                    throw new SerializationException(SR.Format(SR.Serialization_Map, objectOp._objectTypeEnum.ToString()));
                }
            }

            pr._objectId   = _objectReader.GetId(_binaryObject._objectId);
            pr._objectInfo = objectMap.CreateObjectInfo(ref pr._si, ref pr._memberData);

            if (pr._objectId == _topId)
            {
                pr._objectPositionEnum = InternalObjectPositionE.Top;
            }

            pr._objectTypeEnum = InternalObjectTypeE.Object;
            pr._keyDt          = objectMap._objectName;
            pr._dtType         = objectMap._objectType;
            pr._dtTypeCode     = InternalPrimitiveTypeE.Invalid;
            _objectReader.Parse(pr);
        }
        internal void Run()
        {
            try
            {
                bool flag = true;
                this.ReadBegin();
                this.ReadSerializationHeaderRecord();
                while (flag)
                {
                    byte             num;
                    BinaryHeaderEnum binaryHeaderEnum = BinaryHeaderEnum.Object;
                    switch (this.expectedType)
                    {
                    case BinaryTypeEnum.Primitive:
                        this.ReadMemberPrimitiveUnTyped();
                        goto Label_0177;

                    case BinaryTypeEnum.String:
                    case BinaryTypeEnum.Object:
                    case BinaryTypeEnum.ObjectUrt:
                    case BinaryTypeEnum.ObjectUser:
                    case BinaryTypeEnum.ObjectArray:
                    case BinaryTypeEnum.StringArray:
                    case BinaryTypeEnum.PrimitiveArray:
                        num = this.dataReader.ReadByte();
                        binaryHeaderEnum = (BinaryHeaderEnum)num;
                        switch (binaryHeaderEnum)
                        {
                        case BinaryHeaderEnum.Object:
                            goto Label_00C9;

                        case BinaryHeaderEnum.ObjectWithMap:
                        case BinaryHeaderEnum.ObjectWithMapAssemId:
                            goto Label_00DF;

                        case BinaryHeaderEnum.ObjectWithMapTyped:
                        case BinaryHeaderEnum.ObjectWithMapTypedAssemId:
                            goto Label_00EB;

                        case BinaryHeaderEnum.ObjectString:
                        case BinaryHeaderEnum.CrossAppDomainString:
                            goto Label_0100;

                        case BinaryHeaderEnum.Array:
                        case BinaryHeaderEnum.ArraySinglePrimitive:
                        case BinaryHeaderEnum.ArraySingleObject:
                        case BinaryHeaderEnum.ArraySingleString:
                            goto Label_0109;

                        case BinaryHeaderEnum.MemberPrimitiveTyped:
                            goto Label_0112;

                        case BinaryHeaderEnum.MemberReference:
                            goto Label_011A;

                        case BinaryHeaderEnum.ObjectNull:
                        case BinaryHeaderEnum.ObjectNullMultiple256:
                        case BinaryHeaderEnum.ObjectNullMultiple:
                            goto Label_0122;

                        case BinaryHeaderEnum.MessageEnd:
                            goto Label_012B;

                        case BinaryHeaderEnum.CrossAppDomainMap:
                            goto Label_00D4;

                        case BinaryHeaderEnum.MethodCall:
                        case BinaryHeaderEnum.MethodReturn:
                            goto Label_00F7;
                        }
                        goto Label_013B;

                    default:
                        throw new SerializationException(Environment.GetResourceString("Serialization_TypeExpected"));
                    }
                    this.ReadAssembly(binaryHeaderEnum);
                    goto Label_0177;
Label_00C9:
                    this.ReadObject();
                    goto Label_0177;
Label_00D4:
                    this.ReadCrossAppDomainMap();
                    goto Label_0177;
Label_00DF:
                    this.ReadObjectWithMap(binaryHeaderEnum);
                    goto Label_0177;
Label_00EB:
                    this.ReadObjectWithMapTyped(binaryHeaderEnum);
                    goto Label_0177;
Label_00F7:
                    this.ReadMethodObject(binaryHeaderEnum);
                    goto Label_0177;
Label_0100:
                    this.ReadObjectString(binaryHeaderEnum);
                    goto Label_0177;
Label_0109:
                    this.ReadArray(binaryHeaderEnum);
                    goto Label_0177;
Label_0112:
                    this.ReadMemberPrimitiveTyped();
                    goto Label_0177;
Label_011A:
                    this.ReadMemberReference();
                    goto Label_0177;
Label_0122:
                    this.ReadObjectNull(binaryHeaderEnum);
                    goto Label_0177;
Label_012B:
                    flag = false;
                    this.ReadMessageEnd();
                    this.ReadEnd();
                    goto Label_0177;
                    Label_013B :;
                    throw new SerializationException(Environment.GetResourceString("Serialization_BinaryHeader", new object[] { num }));
Label_0177:
                    if (binaryHeaderEnum != BinaryHeaderEnum.Assembly)
                    {
                        bool next = false;
                        while (!next)
                        {
                            ObjectProgress op = (ObjectProgress)this.stack.Peek();
                            if (op == null)
                            {
                                this.expectedType            = BinaryTypeEnum.ObjectUrt;
                                this.expectedTypeInformation = null;
                                next = true;
                            }
                            else
                            {
                                next = op.GetNext(out op.expectedType, out op.expectedTypeInformation);
                                this.expectedType            = op.expectedType;
                                this.expectedTypeInformation = op.expectedTypeInformation;
                                if (!next)
                                {
                                    this.prs.Init();
                                    if (op.memberValueEnum == InternalMemberValueE.Nested)
                                    {
                                        this.prs.PRparseTypeEnum   = InternalParseTypeE.MemberEnd;
                                        this.prs.PRmemberTypeEnum  = op.memberTypeEnum;
                                        this.prs.PRmemberValueEnum = op.memberValueEnum;
                                        this.objectReader.Parse(this.prs);
                                    }
                                    else
                                    {
                                        this.prs.PRparseTypeEnum   = InternalParseTypeE.ObjectEnd;
                                        this.prs.PRmemberTypeEnum  = op.memberTypeEnum;
                                        this.prs.PRmemberValueEnum = op.memberValueEnum;
                                        this.objectReader.Parse(this.prs);
                                    }
                                    this.stack.Pop();
                                    this.PutOp(op);
                                }
                            }
                        }
                    }
                }
            }
            catch (EndOfStreamException)
            {
                throw new SerializationException(Environment.GetResourceString("Serialization_StreamEnd"));
            }
        }
示例#26
0
        private void ReadObject()
        {
            if (this.binaryObject == null)
            {
                this.binaryObject = new BinaryObject();
            }
            this.binaryObject.Read(this);
            this.binaryObject.Dump();
            ObjectMap objectMap = (ObjectMap)this.ObjectMapIdTable[this.binaryObject.mapId];

            if (objectMap == null)
            {
                throw new SerializationException(Environment.GetResourceString("Serialization_Map", (object)this.binaryObject.mapId));
            }
            ObjectProgress op = this.GetOp();
            ParseRecord    pr = op.pr;

            this.stack.Push((object)op);
            op.objectTypeEnum   = InternalObjectTypeE.Object;
            op.binaryTypeEnumA  = objectMap.binaryTypeEnumA;
            op.memberNames      = objectMap.memberNames;
            op.memberTypes      = objectMap.memberTypes;
            op.typeInformationA = objectMap.typeInformationA;
            ObjectProgress objectProgress1 = op;
            int            length          = objectProgress1.binaryTypeEnumA.Length;

            objectProgress1.memberLength = length;
            ObjectProgress objectProgress2 = (ObjectProgress)this.stack.PeekPeek();

            if (objectProgress2 == null || objectProgress2.isInitial)
            {
                op.name            = objectMap.objectName;
                pr.PRparseTypeEnum = InternalParseTypeE.Object;
                op.memberValueEnum = InternalMemberValueE.Empty;
            }
            else
            {
                pr.PRparseTypeEnum   = InternalParseTypeE.Member;
                pr.PRmemberValueEnum = InternalMemberValueE.Nested;
                op.memberValueEnum   = InternalMemberValueE.Nested;
                switch (objectProgress2.objectTypeEnum)
                {
                case InternalObjectTypeE.Object:
                    pr.PRname           = objectProgress2.name;
                    pr.PRmemberTypeEnum = InternalMemberTypeE.Field;
                    op.memberTypeEnum   = InternalMemberTypeE.Field;
                    break;

                case InternalObjectTypeE.Array:
                    pr.PRmemberTypeEnum = InternalMemberTypeE.Item;
                    op.memberTypeEnum   = InternalMemberTypeE.Item;
                    break;

                default:
                    throw new SerializationException(Environment.GetResourceString("Serialization_Map", (object)objectProgress2.objectTypeEnum.ToString()));
                }
            }
            pr.PRobjectId   = this.objectReader.GetId((long)this.binaryObject.objectId);
            pr.PRobjectInfo = objectMap.CreateObjectInfo(ref pr.PRsi, ref pr.PRmemberData);
            if (pr.PRobjectId == this.topId)
            {
                pr.PRobjectPositionEnum = InternalObjectPositionE.Top;
            }
            pr.PRobjectTypeEnum = InternalObjectTypeE.Object;
            pr.PRkeyDt          = objectMap.objectName;
            pr.PRdtType         = objectMap.objectType;
            pr.PRdtTypeCode     = InternalPrimitiveTypeE.Invalid;
            this.objectReader.Parse(pr);
        }
示例#27
0
        private void ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)
        {
            BinaryAssemblyInfo assemblyInfo = (BinaryAssemblyInfo)null;
            ObjectProgress     op           = this.GetOp();
            ParseRecord        pr           = op.pr;

            this.stack.Push((object)op);
            if (record.binaryHeaderEnum == BinaryHeaderEnum.ObjectWithMapTypedAssemId)
            {
                if (record.assemId < 1)
                {
                    throw new SerializationException(Environment.GetResourceString("Serialization_AssemblyId", (object)record.name));
                }
                assemblyInfo = (BinaryAssemblyInfo)this.AssemIdToAssemblyTable[record.assemId];
                if (assemblyInfo == null)
                {
                    throw new SerializationException(Environment.GetResourceString("Serialization_AssemblyId", (object)(record.assemId.ToString() + " " + record.name)));
                }
            }
            else if (record.binaryHeaderEnum == BinaryHeaderEnum.ObjectWithMapTyped)
            {
                assemblyInfo = this.SystemAssemblyInfo;
            }
            ObjectMap objectMap = ObjectMap.Create(record.name, record.memberNames, record.binaryTypeEnumA, record.typeInformationA, record.memberAssemIds, this.objectReader, record.objectId, assemblyInfo, this.AssemIdToAssemblyTable);

            this.ObjectMapIdTable[record.objectId] = (object)objectMap;
            op.objectTypeEnum   = InternalObjectTypeE.Object;
            op.binaryTypeEnumA  = objectMap.binaryTypeEnumA;
            op.typeInformationA = objectMap.typeInformationA;
            ObjectProgress objectProgress1 = op;
            int            length          = objectProgress1.binaryTypeEnumA.Length;

            objectProgress1.memberLength = length;
            op.memberNames = objectMap.memberNames;
            op.memberTypes = objectMap.memberTypes;
            ObjectProgress objectProgress2 = (ObjectProgress)this.stack.PeekPeek();

            if (objectProgress2 == null || objectProgress2.isInitial)
            {
                op.name            = record.name;
                pr.PRparseTypeEnum = InternalParseTypeE.Object;
                op.memberValueEnum = InternalMemberValueE.Empty;
            }
            else
            {
                pr.PRparseTypeEnum   = InternalParseTypeE.Member;
                pr.PRmemberValueEnum = InternalMemberValueE.Nested;
                op.memberValueEnum   = InternalMemberValueE.Nested;
                switch (objectProgress2.objectTypeEnum)
                {
                case InternalObjectTypeE.Object:
                    pr.PRname           = objectProgress2.name;
                    pr.PRmemberTypeEnum = InternalMemberTypeE.Field;
                    op.memberTypeEnum   = InternalMemberTypeE.Field;
                    break;

                case InternalObjectTypeE.Array:
                    pr.PRmemberTypeEnum = InternalMemberTypeE.Item;
                    op.memberTypeEnum   = InternalMemberTypeE.Item;
                    break;

                default:
                    throw new SerializationException(Environment.GetResourceString("Serialization_ObjectTypeEnum", (object)objectProgress2.objectTypeEnum.ToString()));
                }
            }
            pr.PRobjectTypeEnum = InternalObjectTypeE.Object;
            pr.PRobjectInfo     = objectMap.CreateObjectInfo(ref pr.PRsi, ref pr.PRmemberData);
            pr.PRobjectId       = this.objectReader.GetId((long)record.objectId);
            if (pr.PRobjectId == this.topId)
            {
                pr.PRobjectPositionEnum = InternalObjectPositionE.Top;
            }
            pr.PRkeyDt      = record.name;
            pr.PRdtType     = objectMap.objectType;
            pr.PRdtTypeCode = InternalPrimitiveTypeE.Invalid;
            this.objectReader.Parse(pr);
        }
        private void ReadArray(BinaryHeaderEnum binaryHeaderEnum)
        {
            BinaryAssemblyInfo assemblyInfo = null;
            BinaryArray        array        = new BinaryArray(binaryHeaderEnum);

            array.Read(this);
            if (array.binaryTypeEnum == BinaryTypeEnum.ObjectUser)
            {
                if (array.assemId < 1)
                {
                    throw new SerializationException(Environment.GetResourceString("Serialization_AssemblyId", new object[] { array.typeInformation }));
                }
                assemblyInfo = (BinaryAssemblyInfo)this.AssemIdToAssemblyTable[array.assemId];
            }
            else
            {
                assemblyInfo = this.SystemAssemblyInfo;
            }
            ObjectProgress op = this.GetOp();
            ParseRecord    pr = op.pr;

            op.objectTypeEnum  = InternalObjectTypeE.Array;
            op.binaryTypeEnum  = array.binaryTypeEnum;
            op.typeInformation = array.typeInformation;
            ObjectProgress progress2 = (ObjectProgress)this.stack.PeekPeek();

            if ((progress2 == null) || (array.objectId > 0))
            {
                op.name            = "System.Array";
                pr.PRparseTypeEnum = InternalParseTypeE.Object;
                op.memberValueEnum = InternalMemberValueE.Empty;
            }
            else
            {
                pr.PRparseTypeEnum   = InternalParseTypeE.Member;
                pr.PRmemberValueEnum = InternalMemberValueE.Nested;
                op.memberValueEnum   = InternalMemberValueE.Nested;
                switch (progress2.objectTypeEnum)
                {
                case InternalObjectTypeE.Object:
                    pr.PRname           = progress2.name;
                    pr.PRmemberTypeEnum = InternalMemberTypeE.Field;
                    op.memberTypeEnum   = InternalMemberTypeE.Field;
                    pr.PRkeyDt          = progress2.name;
                    pr.PRdtType         = progress2.dtType;
                    goto Label_0177;

                case InternalObjectTypeE.Array:
                    pr.PRmemberTypeEnum = InternalMemberTypeE.Item;
                    op.memberTypeEnum   = InternalMemberTypeE.Item;
                    goto Label_0177;
                }
                throw new SerializationException(Environment.GetResourceString("Serialization_ObjectTypeEnum", new object[] { progress2.objectTypeEnum.ToString() }));
            }
Label_0177:
            pr.PRobjectId = this.objectReader.GetId((long)array.objectId);
            if (pr.PRobjectId == this.topId)
            {
                pr.PRobjectPositionEnum = InternalObjectPositionE.Top;
            }
            else if ((this.headerId > 0L) && (pr.PRobjectId == this.headerId))
            {
                pr.PRobjectPositionEnum = InternalObjectPositionE.Headers;
            }
            else
            {
                pr.PRobjectPositionEnum = InternalObjectPositionE.Child;
            }
            pr.PRobjectTypeEnum = InternalObjectTypeE.Array;
            BinaryConverter.TypeFromInfo(array.binaryTypeEnum, array.typeInformation, this.objectReader, assemblyInfo, out pr.PRarrayElementTypeCode, out pr.PRarrayElementTypeString, out pr.PRarrayElementType, out pr.PRisArrayVariant);
            pr.PRdtTypeCode  = InternalPrimitiveTypeE.Invalid;
            pr.PRrank        = array.rank;
            pr.PRlengthA     = array.lengthA;
            pr.PRlowerBoundA = array.lowerBoundA;
            bool flag = false;

            switch (array.binaryArrayTypeEnum)
            {
            case BinaryArrayTypeEnum.Single:
            case BinaryArrayTypeEnum.SingleOffset:
                op.numItems        = array.lengthA[0];
                pr.PRarrayTypeEnum = InternalArrayTypeE.Single;
                if (Converter.IsWriteAsByteArray(pr.PRarrayElementTypeCode) && (array.lowerBoundA[0] == 0))
                {
                    flag = true;
                    this.ReadArrayAsBytes(pr);
                }
                break;

            case BinaryArrayTypeEnum.Jagged:
            case BinaryArrayTypeEnum.JaggedOffset:
                op.numItems        = array.lengthA[0];
                pr.PRarrayTypeEnum = InternalArrayTypeE.Jagged;
                break;

            case BinaryArrayTypeEnum.Rectangular:
            case BinaryArrayTypeEnum.RectangularOffset:
            {
                int num = 1;
                for (int i = 0; i < array.rank; i++)
                {
                    num *= array.lengthA[i];
                }
                op.numItems        = num;
                pr.PRarrayTypeEnum = InternalArrayTypeE.Rectangular;
                break;
            }

            default:
                throw new SerializationException(Environment.GetResourceString("Serialization_ArrayType", new object[] { array.binaryArrayTypeEnum.ToString() }));
            }
            if (!flag)
            {
                this.stack.Push(op);
            }
            else
            {
                this.PutOp(op);
            }
            this.objectReader.Parse(pr);
            if (flag)
            {
                pr.PRparseTypeEnum = InternalParseTypeE.ObjectEnd;
                this.objectReader.Parse(pr);
            }
        }
示例#29
0
        private void ReadObjectString(BinaryHeaderEnum binaryHeaderEnum)
        {
            if (this.objectString == null)
            {
                this.objectString = new BinaryObjectString();
            }
            if (binaryHeaderEnum == BinaryHeaderEnum.ObjectString)
            {
                this.objectString.Read(this);
                this.objectString.Dump();
            }
            else
            {
                if (this.crossAppDomainString == null)
                {
                    this.crossAppDomainString = new BinaryCrossAppDomainString();
                }
                this.crossAppDomainString.Read(this);
                this.crossAppDomainString.Dump();
                this.objectString.value = this.objectReader.CrossAppDomainArray(this.crossAppDomainString.value) as string;
                if (this.objectString.value == null)
                {
                    throw new SerializationException(Environment.GetResourceString("Serialization_CrossAppDomainError", (object)"String", (object)this.crossAppDomainString.value));
                }
                this.objectString.objectId = this.crossAppDomainString.objectId;
            }
            this.prs.Init();
            this.prs.PRparseTypeEnum = InternalParseTypeE.Object;
            this.prs.PRobjectId      = this.objectReader.GetId((long)this.objectString.objectId);
            if (this.prs.PRobjectId == this.topId)
            {
                this.prs.PRobjectPositionEnum = InternalObjectPositionE.Top;
            }
            this.prs.PRobjectTypeEnum = InternalObjectTypeE.Object;
            ObjectProgress objectProgress = (ObjectProgress)this.stack.Peek();

            this.prs.PRvalue      = this.objectString.value;
            this.prs.PRkeyDt      = "System.String";
            this.prs.PRdtType     = Converter.typeofString;
            this.prs.PRdtTypeCode = InternalPrimitiveTypeE.Invalid;
            this.prs.PRvarValue   = (object)this.objectString.value;
            if (objectProgress == null)
            {
                this.prs.PRparseTypeEnum = InternalParseTypeE.Object;
                this.prs.PRname          = "System.String";
            }
            else
            {
                this.prs.PRparseTypeEnum   = InternalParseTypeE.Member;
                this.prs.PRmemberValueEnum = InternalMemberValueE.InlineValue;
                switch (objectProgress.objectTypeEnum)
                {
                case InternalObjectTypeE.Object:
                    this.prs.PRname           = objectProgress.name;
                    this.prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
                    break;

                case InternalObjectTypeE.Array:
                    this.prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
                    break;

                default:
                    throw new SerializationException(Environment.GetResourceString("Serialization_ObjectTypeEnum", (object)objectProgress.objectTypeEnum.ToString()));
                }
            }
            this.objectReader.Parse(this.prs);
        }
示例#30
0
        private void ReadArray(BinaryHeaderEnum binaryHeaderEnum)
        {
            BinaryArray binaryArray = new BinaryArray(binaryHeaderEnum);

            binaryArray.Read(this);
            BinaryAssemblyInfo assemblyInfo;

            if (binaryArray.binaryTypeEnum == BinaryTypeEnum.ObjectUser)
            {
                if (binaryArray.assemId < 1)
                {
                    throw new SerializationException(Environment.GetResourceString("Serialization_AssemblyId", binaryArray.typeInformation));
                }
                assemblyInfo = (BinaryAssemblyInfo)this.AssemIdToAssemblyTable[binaryArray.assemId];
            }
            else
            {
                assemblyInfo = this.SystemAssemblyInfo;
            }
            ObjectProgress op = this.GetOp();
            ParseRecord    pr = op.pr;

            op.objectTypeEnum  = InternalObjectTypeE.Array;
            op.binaryTypeEnum  = binaryArray.binaryTypeEnum;
            op.typeInformation = binaryArray.typeInformation;
            ObjectProgress objectProgress = (ObjectProgress)this.stack.PeekPeek();

            if (objectProgress == null || binaryArray.objectId > 0)
            {
                op.name            = "System.Array";
                pr.PRparseTypeEnum = InternalParseTypeE.Object;
                op.memberValueEnum = InternalMemberValueE.Empty;
            }
            else
            {
                pr.PRparseTypeEnum   = InternalParseTypeE.Member;
                pr.PRmemberValueEnum = InternalMemberValueE.Nested;
                op.memberValueEnum   = InternalMemberValueE.Nested;
                switch (objectProgress.objectTypeEnum)
                {
                case InternalObjectTypeE.Object:
                    pr.PRname           = objectProgress.name;
                    pr.PRmemberTypeEnum = InternalMemberTypeE.Field;
                    op.memberTypeEnum   = InternalMemberTypeE.Field;
                    pr.PRkeyDt          = objectProgress.name;
                    pr.PRdtType         = objectProgress.dtType;
                    break;

                case InternalObjectTypeE.Array:
                    pr.PRmemberTypeEnum = InternalMemberTypeE.Item;
                    op.memberTypeEnum   = InternalMemberTypeE.Item;
                    break;

                default:
                    throw new SerializationException(Environment.GetResourceString("Serialization_ObjectTypeEnum", (object)objectProgress.objectTypeEnum.ToString()));
                }
            }
            pr.PRobjectId           = this.objectReader.GetId((long)binaryArray.objectId);
            pr.PRobjectPositionEnum = pr.PRobjectId != this.topId ? (this.headerId <= 0L || pr.PRobjectId != this.headerId ? InternalObjectPositionE.Child : InternalObjectPositionE.Headers) : InternalObjectPositionE.Top;
            pr.PRobjectTypeEnum     = InternalObjectTypeE.Array;
            BinaryConverter.TypeFromInfo(binaryArray.binaryTypeEnum, binaryArray.typeInformation, this.objectReader, assemblyInfo, out pr.PRarrayElementTypeCode, out pr.PRarrayElementTypeString, out pr.PRarrayElementType, out pr.PRisArrayVariant);
            pr.PRdtTypeCode  = InternalPrimitiveTypeE.Invalid;
            pr.PRrank        = binaryArray.rank;
            pr.PRlengthA     = binaryArray.lengthA;
            pr.PRlowerBoundA = binaryArray.lowerBoundA;
            bool flag = false;

            switch (binaryArray.binaryArrayTypeEnum)
            {
            case BinaryArrayTypeEnum.Single:
            case BinaryArrayTypeEnum.SingleOffset:
                op.numItems        = binaryArray.lengthA[0];
                pr.PRarrayTypeEnum = InternalArrayTypeE.Single;
                if (Converter.IsWriteAsByteArray(pr.PRarrayElementTypeCode) && binaryArray.lowerBoundA[0] == 0)
                {
                    flag = true;
                    this.ReadArrayAsBytes(pr);
                    break;
                }
                break;

            case BinaryArrayTypeEnum.Jagged:
            case BinaryArrayTypeEnum.JaggedOffset:
                op.numItems        = binaryArray.lengthA[0];
                pr.PRarrayTypeEnum = InternalArrayTypeE.Jagged;
                break;

            case BinaryArrayTypeEnum.Rectangular:
            case BinaryArrayTypeEnum.RectangularOffset:
                int num = 1;
                for (int index = 0; index < binaryArray.rank; ++index)
                {
                    num *= binaryArray.lengthA[index];
                }
                op.numItems        = num;
                pr.PRarrayTypeEnum = InternalArrayTypeE.Rectangular;
                break;

            default:
                throw new SerializationException(Environment.GetResourceString("Serialization_ArrayType", (object)binaryArray.binaryArrayTypeEnum.ToString()));
            }
            if (!flag)
            {
                this.stack.Push((object)op);
            }
            else
            {
                this.PutOp(op);
            }
            this.objectReader.Parse(pr);
            if (!flag)
            {
                return;
            }
            pr.PRparseTypeEnum = InternalParseTypeE.ObjectEnd;
            this.objectReader.Parse(pr);
        }
示例#31
0
        private ObjectProgress GetOp()
        {
            ObjectProgress op = null;

            if (_opPool != null && !_opPool.IsEmpty())
            {
                op = (ObjectProgress)_opPool.Pop();
                op.Init();
            }
            else
            {
                op = new ObjectProgress();
            }

            return op;
        }
示例#32
0
        internal void Run()
        {
            try
            {
                bool flag1 = true;
                this.ReadBegin();
                this.ReadSerializationHeaderRecord();
                while (flag1)
                {
                    BinaryHeaderEnum binaryHeaderEnum = BinaryHeaderEnum.Object;
                    switch (this.expectedType)
                    {
                    case BinaryTypeEnum.Primitive:
                        this.ReadMemberPrimitiveUnTyped();
                        break;

                    case BinaryTypeEnum.String:
                    case BinaryTypeEnum.Object:
                    case BinaryTypeEnum.ObjectUrt:
                    case BinaryTypeEnum.ObjectUser:
                    case BinaryTypeEnum.ObjectArray:
                    case BinaryTypeEnum.StringArray:
                    case BinaryTypeEnum.PrimitiveArray:
                        byte num = this.dataReader.ReadByte();
                        binaryHeaderEnum = (BinaryHeaderEnum)num;
                        switch (binaryHeaderEnum)
                        {
                        case BinaryHeaderEnum.Object:
                            this.ReadObject();
                            break;

                        case BinaryHeaderEnum.ObjectWithMap:
                        case BinaryHeaderEnum.ObjectWithMapAssemId:
                            this.ReadObjectWithMap(binaryHeaderEnum);
                            break;

                        case BinaryHeaderEnum.ObjectWithMapTyped:
                        case BinaryHeaderEnum.ObjectWithMapTypedAssemId:
                            this.ReadObjectWithMapTyped(binaryHeaderEnum);
                            break;

                        case BinaryHeaderEnum.ObjectString:
                        case BinaryHeaderEnum.CrossAppDomainString:
                            this.ReadObjectString(binaryHeaderEnum);
                            break;

                        case BinaryHeaderEnum.Array:
                        case BinaryHeaderEnum.ArraySinglePrimitive:
                        case BinaryHeaderEnum.ArraySingleObject:
                        case BinaryHeaderEnum.ArraySingleString:
                            this.ReadArray(binaryHeaderEnum);
                            break;

                        case BinaryHeaderEnum.MemberPrimitiveTyped:
                            this.ReadMemberPrimitiveTyped();
                            break;

                        case BinaryHeaderEnum.MemberReference:
                            this.ReadMemberReference();
                            break;

                        case BinaryHeaderEnum.ObjectNull:
                        case BinaryHeaderEnum.ObjectNullMultiple256:
                        case BinaryHeaderEnum.ObjectNullMultiple:
                            this.ReadObjectNull(binaryHeaderEnum);
                            break;

                        case BinaryHeaderEnum.MessageEnd:
                            flag1 = false;
                            this.ReadMessageEnd();
                            this.ReadEnd();
                            break;

                        case BinaryHeaderEnum.Assembly:
                        case BinaryHeaderEnum.CrossAppDomainAssembly:
                            this.ReadAssembly(binaryHeaderEnum);
                            break;

                        case BinaryHeaderEnum.CrossAppDomainMap:
                            this.ReadCrossAppDomainMap();
                            break;

                        case BinaryHeaderEnum.MethodCall:
                        case BinaryHeaderEnum.MethodReturn:
                            this.ReadMethodObject(binaryHeaderEnum);
                            break;

                        default:
                            throw new SerializationException(Environment.GetResourceString("Serialization_BinaryHeader", (object)num));
                        }

                    default:
                        throw new SerializationException(Environment.GetResourceString("Serialization_TypeExpected"));
                    }
                    if (binaryHeaderEnum != BinaryHeaderEnum.Assembly)
                    {
                        bool flag2 = false;
                        while (!flag2)
                        {
                            ObjectProgress op = (ObjectProgress)this.stack.Peek();
                            if (op == null)
                            {
                                this.expectedType            = BinaryTypeEnum.ObjectUrt;
                                this.expectedTypeInformation = (object)null;
                                flag2 = true;
                            }
                            else
                            {
                                ObjectProgress objectProgress = op;
                                // ISSUE: explicit reference operation
                                // ISSUE: variable of a reference type
                                BinaryTypeEnum& outBinaryTypeEnum = @objectProgress.expectedType;
                                // ISSUE: explicit reference operation
                                // ISSUE: variable of a reference type
                                object& outTypeInformation = @op.expectedTypeInformation;
                                flag2                        = objectProgress.GetNext(outBinaryTypeEnum, outTypeInformation);
                                this.expectedType            = op.expectedType;
                                this.expectedTypeInformation = op.expectedTypeInformation;
                                if (!flag2)
                                {
                                    this.prs.Init();
                                    if (op.memberValueEnum == InternalMemberValueE.Nested)
                                    {
                                        this.prs.PRparseTypeEnum   = InternalParseTypeE.MemberEnd;
                                        this.prs.PRmemberTypeEnum  = op.memberTypeEnum;
                                        this.prs.PRmemberValueEnum = op.memberValueEnum;
                                        this.objectReader.Parse(this.prs);
                                    }
                                    else
                                    {
                                        this.prs.PRparseTypeEnum   = InternalParseTypeE.ObjectEnd;
                                        this.prs.PRmemberTypeEnum  = op.memberTypeEnum;
                                        this.prs.PRmemberValueEnum = op.memberValueEnum;
                                        this.objectReader.Parse(this.prs);
                                    }
                                    this.stack.Pop();
                                    this.PutOp(op);
                                }
                            }
                        }
                    }
                }
            }
            catch (EndOfStreamException ex)
            {
                throw new SerializationException(Environment.GetResourceString("Serialization_StreamEnd"));
            }
        }