FromString() static private method

static private FromString ( string value, InternalPrimitiveTypeE code ) : object
value string
code InternalPrimitiveTypeE
return object
示例#1
0
        private void ParseMember(ParseRecord pr)
        {
            ParseRecord parseRecord = (ParseRecord)this.stack.Peek();

            if (parseRecord != null)
            {
                string str = parseRecord.PRname;
            }
            switch (pr.PRmemberTypeEnum)
            {
            case InternalMemberTypeE.Item:
                this.ParseArrayMember(pr);
                break;

            default:
                if (pr.PRdtType == null && parseRecord.PRobjectInfo.isTyped)
                {
                    pr.PRdtType = parseRecord.PRobjectInfo.GetType(pr.PRname);
                    if (pr.PRdtType != null)
                    {
                        pr.PRdtTypeCode = Converter.ToCode(pr.PRdtType);
                    }
                }
                if (pr.PRmemberValueEnum == InternalMemberValueE.Null)
                {
                    parseRecord.PRobjectInfo.AddValue(pr.PRname, (object)null, ref parseRecord.PRsi, ref parseRecord.PRmemberData);
                    break;
                }
                if (pr.PRmemberValueEnum == InternalMemberValueE.Nested)
                {
                    this.ParseObject(pr);
                    this.stack.Push((object)pr);
                    if (pr.PRobjectInfo != null && pr.PRobjectInfo.objectType != null && pr.PRobjectInfo.objectType.IsValueType)
                    {
                        pr.PRisValueTypeFixup = true;
                        this.ValueFixupStack.Push((object)new ValueFixup(parseRecord.PRnewObj, pr.PRname, parseRecord.PRobjectInfo));
                        break;
                    }
                    parseRecord.PRobjectInfo.AddValue(pr.PRname, pr.PRnewObj, ref parseRecord.PRsi, ref parseRecord.PRmemberData);
                    break;
                }
                if (pr.PRmemberValueEnum == InternalMemberValueE.Reference)
                {
                    object @object = this.m_objectManager.GetObject(pr.PRidRef);
                    if (@object == null)
                    {
                        parseRecord.PRobjectInfo.AddValue(pr.PRname, (object)null, ref parseRecord.PRsi, ref parseRecord.PRmemberData);
                        parseRecord.PRobjectInfo.RecordFixup(parseRecord.PRobjectId, pr.PRname, pr.PRidRef);
                        break;
                    }
                    parseRecord.PRobjectInfo.AddValue(pr.PRname, @object, ref parseRecord.PRsi, ref parseRecord.PRmemberData);
                    break;
                }
                if (pr.PRmemberValueEnum == InternalMemberValueE.InlineValue)
                {
                    if (pr.PRdtType == Converter.typeofString)
                    {
                        this.ParseString(pr, parseRecord);
                        parseRecord.PRobjectInfo.AddValue(pr.PRname, (object)pr.PRvalue, ref parseRecord.PRsi, ref parseRecord.PRmemberData);
                        break;
                    }
                    if (pr.PRdtTypeCode == InternalPrimitiveTypeE.Invalid)
                    {
                        if (pr.PRarrayTypeEnum == InternalArrayTypeE.Base64)
                        {
                            parseRecord.PRobjectInfo.AddValue(pr.PRname, (object)Convert.FromBase64String(pr.PRvalue), ref parseRecord.PRsi, ref parseRecord.PRmemberData);
                            break;
                        }
                        if (pr.PRdtType == Converter.typeofObject)
                        {
                            throw new SerializationException(Environment.GetResourceString("Serialization_TypeMissing", (object)pr.PRname));
                        }
                        this.ParseString(pr, parseRecord);
                        if (pr.PRdtType == Converter.typeofSystemVoid)
                        {
                            parseRecord.PRobjectInfo.AddValue(pr.PRname, (object)pr.PRdtType, ref parseRecord.PRsi, ref parseRecord.PRmemberData);
                            break;
                        }
                        if (!parseRecord.PRobjectInfo.isSi)
                        {
                            break;
                        }
                        parseRecord.PRobjectInfo.AddValue(pr.PRname, (object)pr.PRvalue, ref parseRecord.PRsi, ref parseRecord.PRmemberData);
                        break;
                    }
                    object obj = pr.PRvarValue == null?Converter.FromString(pr.PRvalue, pr.PRdtTypeCode) : pr.PRvarValue;

                    parseRecord.PRobjectInfo.AddValue(pr.PRname, obj, ref parseRecord.PRsi, ref parseRecord.PRmemberData);
                    break;
                }
                this.ParseError(pr, parseRecord);
                break;
            }
        }
示例#2
0
        // Object member encountered in stream
        private void ParseMember(ParseRecord pr)
        {
            ParseRecord objectPr = (ParseRecord)_stack.Peek();
            string      objName  = objectPr?._name;

            switch (pr._memberTypeEnum)
            {
            case InternalMemberTypeE.Item:
                ParseArrayMember(pr);
                return;

            case InternalMemberTypeE.Field:
                break;
            }

            //if ((pr.PRdtType == null) && !objectPr.PRobjectInfo.isSi)
            if (pr._dtType == null && objectPr._objectInfo._isTyped)
            {
                pr._dtType = objectPr._objectInfo.GetType(pr._name);

                if (pr._dtType != null)
                {
                    pr._dtTypeCode = Converter.ToCode(pr._dtType);
                }
            }

            if (pr._memberValueEnum == InternalMemberValueE.Null)
            {
                // Value is Null
                objectPr._objectInfo.AddValue(pr._name, null, ref objectPr._si, ref objectPr._memberData);
            }
            else if (pr._memberValueEnum == InternalMemberValueE.Nested)
            {
                ParseObject(pr);
                _stack.Push(pr);

                if ((pr._objectInfo != null) && pr._objectInfo._objectType != null && (pr._objectInfo._objectType.IsValueType))
                {
                    pr._isValueTypeFixup = true;                                                            //Valuefixup
                    ValueFixupStack.Push(new ValueFixup(objectPr._newObj, pr._name, objectPr._objectInfo)); //valuefixup
                }
                else
                {
                    objectPr._objectInfo.AddValue(pr._name, pr._newObj, ref objectPr._si, ref objectPr._memberData);
                }
            }
            else if (pr._memberValueEnum == InternalMemberValueE.Reference)
            {
                // See if object has already been instantiated
                object refObj = _objectManager.GetObject(pr._idRef);
                if (refObj == null)
                {
                    objectPr._objectInfo.AddValue(pr._name, null, ref objectPr._si, ref objectPr._memberData);
                    objectPr._objectInfo.RecordFixup(objectPr._objectId, pr._name, pr._idRef); // Object not instantiated
                }
                else
                {
                    objectPr._objectInfo.AddValue(pr._name, refObj, ref objectPr._si, ref objectPr._memberData);
                }
            }

            else if (pr._memberValueEnum == InternalMemberValueE.InlineValue)
            {
                // Primitive type or String
                if (ReferenceEquals(pr._dtType, Converter.s_typeofString))
                {
                    ParseString(pr, objectPr);
                    objectPr._objectInfo.AddValue(pr._name, pr._value, ref objectPr._si, ref objectPr._memberData);
                }
                else if (pr._dtTypeCode == InternalPrimitiveTypeE.Invalid)
                {
                    // The member field was an object put the value is Inline either  bin.Base64 or invalid
                    if (pr._arrayTypeEnum == InternalArrayTypeE.Base64)
                    {
                        objectPr._objectInfo.AddValue(pr._name, Convert.FromBase64String(pr._value), ref objectPr._si, ref objectPr._memberData);
                    }
                    else if (ReferenceEquals(pr._dtType, Converter.s_typeofObject))
                    {
                        throw new SerializationException(SR.Format(SR.Serialization_TypeMissing, pr._name));
                    }
                    else
                    {
                        ParseString(pr, objectPr); // Register the object if it has an objectId
                        // Object Class with no memberInfo data
                        // only special case where AddValue is needed?
                        if (ReferenceEquals(pr._dtType, Converter.s_typeofSystemVoid))
                        {
                            objectPr._objectInfo.AddValue(pr._name, pr._dtType, ref objectPr._si, ref objectPr._memberData);
                        }
                        else if (objectPr._objectInfo._isSi)
                        {
                            // ISerializable are added as strings, the conversion to type is done by the
                            // ISerializable object
                            objectPr._objectInfo.AddValue(pr._name, pr._value, ref objectPr._si, ref objectPr._memberData);
                        }
                    }
                }
                else
                {
                    object var = pr._varValue != null ?
                                 pr._varValue :
                                 Converter.FromString(pr._value, pr._dtTypeCode);
                    objectPr._objectInfo.AddValue(pr._name, var, ref objectPr._si, ref objectPr._memberData);
                }
            }
            else
            {
                ParseError(pr, objectPr);
            }
        }
示例#3
0
        private void ParseArrayMember(ParseRecord pr)
        {
            ParseRecord parseRecord = (ParseRecord)this.stack.Peek();

            if (parseRecord.PRarrayTypeEnum == InternalArrayTypeE.Rectangular)
            {
                if (parseRecord.PRmemberIndex > 0)
                {
                    this.NextRectangleMap(parseRecord);
                }
                if (parseRecord.PRisLowerBound)
                {
                    for (int index = 0; index < parseRecord.PRrank; ++index)
                    {
                        parseRecord.PRindexMap[index] = parseRecord.PRrectangularMap[index] + parseRecord.PRlowerBoundA[index];
                    }
                }
            }
            else
            {
                parseRecord.PRindexMap[0] = parseRecord.PRisLowerBound ? parseRecord.PRlowerBoundA[0] + parseRecord.PRmemberIndex : parseRecord.PRmemberIndex;
            }
            if (pr.PRmemberValueEnum == InternalMemberValueE.Reference)
            {
                object @object = this.m_objectManager.GetObject(pr.PRidRef);
                if (@object == null)
                {
                    int[] indices = new int[parseRecord.PRrank];
                    Array.Copy((Array)parseRecord.PRindexMap, 0, (Array)indices, 0, parseRecord.PRrank);
                    this.m_objectManager.RecordArrayElementFixup(parseRecord.PRobjectId, indices, pr.PRidRef);
                }
                else if (parseRecord.PRobjectA != null)
                {
                    parseRecord.PRobjectA[parseRecord.PRindexMap[0]] = @object;
                }
                else
                {
                    ((Array)parseRecord.PRnewObj).SetValue(@object, parseRecord.PRindexMap);
                }
            }
            else if (pr.PRmemberValueEnum == InternalMemberValueE.Nested)
            {
                if (pr.PRdtType == null)
                {
                    pr.PRdtType = parseRecord.PRarrayElementType;
                }
                this.ParseObject(pr);
                this.stack.Push((object)pr);
                if (parseRecord.PRarrayElementType != null)
                {
                    if (parseRecord.PRarrayElementType.IsValueType && pr.PRarrayElementTypeCode == InternalPrimitiveTypeE.Invalid)
                    {
                        pr.PRisValueTypeFixup = true;
                        this.ValueFixupStack.Push((object)new ValueFixup((Array)parseRecord.PRnewObj, parseRecord.PRindexMap));
                    }
                    else if (parseRecord.PRobjectA != null)
                    {
                        parseRecord.PRobjectA[parseRecord.PRindexMap[0]] = pr.PRnewObj;
                    }
                    else
                    {
                        ((Array)parseRecord.PRnewObj).SetValue(pr.PRnewObj, parseRecord.PRindexMap);
                    }
                }
            }
            else if (pr.PRmemberValueEnum == InternalMemberValueE.InlineValue)
            {
                if (parseRecord.PRarrayElementType == Converter.typeofString || pr.PRdtType == Converter.typeofString)
                {
                    this.ParseString(pr, parseRecord);
                    if (parseRecord.PRobjectA != null)
                    {
                        parseRecord.PRobjectA[parseRecord.PRindexMap[0]] = (object)pr.PRvalue;
                    }
                    else
                    {
                        ((Array)parseRecord.PRnewObj).SetValue((object)pr.PRvalue, parseRecord.PRindexMap);
                    }
                }
                else if (parseRecord.PRisArrayVariant)
                {
                    if (pr.PRkeyDt == null)
                    {
                        throw new SerializationException(Environment.GetResourceString("Serialization_ArrayTypeObject"));
                    }
                    object obj;
                    if (pr.PRdtType == Converter.typeofString)
                    {
                        this.ParseString(pr, parseRecord);
                        obj = (object)pr.PRvalue;
                    }
                    else if ((Enum)pr.PRdtTypeCode == (Enum)InternalPrimitiveTypeE.Invalid)
                    {
                        this.CheckSerializable(pr.PRdtType);
                        obj = !this.IsRemoting || this.formatterEnums.FEsecurityLevel == TypeFilterLevel.Full ? FormatterServices.GetUninitializedObject(pr.PRdtType) : FormatterServices.GetSafeUninitializedObject(pr.PRdtType);
                    }
                    else
                    {
                        obj = pr.PRvarValue == null?Converter.FromString(pr.PRvalue, pr.PRdtTypeCode) : pr.PRvarValue;
                    }
                    if (parseRecord.PRobjectA != null)
                    {
                        parseRecord.PRobjectA[parseRecord.PRindexMap[0]] = obj;
                    }
                    else
                    {
                        ((Array)parseRecord.PRnewObj).SetValue(obj, parseRecord.PRindexMap);
                    }
                }
                else if (parseRecord.PRprimitiveArray != null)
                {
                    parseRecord.PRprimitiveArray.SetValue(pr.PRvalue, parseRecord.PRindexMap[0]);
                }
                else
                {
                    object obj = pr.PRvarValue == null?Converter.FromString(pr.PRvalue, parseRecord.PRarrayElementTypeCode) : pr.PRvarValue;

                    if (parseRecord.PRobjectA != null)
                    {
                        parseRecord.PRobjectA[parseRecord.PRindexMap[0]] = obj;
                    }
                    else
                    {
                        ((Array)parseRecord.PRnewObj).SetValue(obj, parseRecord.PRindexMap);
                    }
                }
            }
            else if (pr.PRmemberValueEnum == InternalMemberValueE.Null)
            {
                parseRecord.PRmemberIndex += pr.PRnullCount - 1;
            }
            else
            {
                this.ParseError(pr, parseRecord);
            }
            ++parseRecord.PRmemberIndex;
        }
示例#4
0
        // Array object item encountered in stream
        private void ParseArrayMember(ParseRecord pr)
        {
            ParseRecord objectPr = (ParseRecord)_stack.Peek();

            // Set up for inserting value into correct array position
            if (objectPr._arrayTypeEnum == InternalArrayTypeE.Rectangular)
            {
                if (objectPr._memberIndex > 0)
                {
                    NextRectangleMap(objectPr); // Rectangle array, calculate position in array
                }
                if (objectPr._isLowerBound)
                {
                    for (int i = 0; i < objectPr._rank; i++)
                    {
                        objectPr._indexMap[i] = objectPr._rectangularMap[i] + objectPr._lowerBoundA[i];
                    }
                }
            }
            else
            {
                objectPr._indexMap[0] = !objectPr._isLowerBound ?
                                        objectPr._memberIndex :                           // Zero based array
                                        objectPr._lowerBoundA[0] + objectPr._memberIndex; // Lower Bound based array
            }

            // Set Array element according to type of element

            if (pr._memberValueEnum == InternalMemberValueE.Reference)
            {
                // Object Reference

                // See if object has already been instantiated
                object refObj = _objectManager.GetObject(pr._idRef);
                if (refObj == null)
                {
                    // Object not instantiated
                    // Array fixup manager
                    int[] fixupIndex = new int[objectPr._rank];
                    Array.Copy(objectPr._indexMap, 0, fixupIndex, 0, objectPr._rank);

                    _objectManager.RecordArrayElementFixup(objectPr._objectId, fixupIndex, pr._idRef);
                }
                else
                {
                    if (objectPr._objectA != null)
                    {
                        objectPr._objectA[objectPr._indexMap[0]] = refObj;
                    }
                    else
                    {
                        ((Array)objectPr._newObj).SetValue(refObj, objectPr._indexMap); // Object has been instantiated
                    }
                }
            }
            else if (pr._memberValueEnum == InternalMemberValueE.Nested)
            {
                //Set up dtType for ParseObject
                if (pr._dtType == null)
                {
                    pr._dtType = objectPr._arrayElementType;
                }

                ParseObject(pr);
                _stack.Push(pr);

                if (objectPr._arrayElementType != null)
                {
                    if ((objectPr._arrayElementType.IsValueType) && (pr._arrayElementTypeCode == InternalPrimitiveTypeE.Invalid))
                    {
                        pr._isValueTypeFixup = true;                                                       //Valuefixup
                        ValueFixupStack.Push(new ValueFixup((Array)objectPr._newObj, objectPr._indexMap)); //valuefixup
                    }
                    else
                    {
                        if (objectPr._objectA != null)
                        {
                            objectPr._objectA[objectPr._indexMap[0]] = pr._newObj;
                        }
                        else
                        {
                            ((Array)objectPr._newObj).SetValue(pr._newObj, objectPr._indexMap);
                        }
                    }
                }
            }
            else if (pr._memberValueEnum == InternalMemberValueE.InlineValue)
            {
                if ((ReferenceEquals(objectPr._arrayElementType, Converter.s_typeofString)) || (ReferenceEquals(pr._dtType, Converter.s_typeofString)))
                {
                    // String in either a string array, or a string element of an object array
                    ParseString(pr, objectPr);
                    if (objectPr._objectA != null)
                    {
                        objectPr._objectA[objectPr._indexMap[0]] = pr._value;
                    }
                    else
                    {
                        ((Array)objectPr._newObj).SetValue(pr._value, objectPr._indexMap);
                    }
                }
                else if (objectPr._isArrayVariant)
                {
                    // Array of type object
                    if (pr._keyDt == null)
                    {
                        throw new SerializationException(SR.Serialization_ArrayTypeObject);
                    }

                    object var = null;

                    if (ReferenceEquals(pr._dtType, Converter.s_typeofString))
                    {
                        ParseString(pr, objectPr);
                        var = pr._value;
                    }
                    else if (ReferenceEquals(pr._dtTypeCode, InternalPrimitiveTypeE.Invalid))
                    {
                        CheckSerializable(pr._dtType);
                        // Not nested and invalid, so it is an empty object
                        var = FormatterServices.GetUninitializedObject(pr._dtType);
                    }
                    else
                    {
                        var = pr._varValue != null ?
                              pr._varValue :
                              Converter.FromString(pr._value, pr._dtTypeCode);
                    }
                    if (objectPr._objectA != null)
                    {
                        objectPr._objectA[objectPr._indexMap[0]] = var;
                    }
                    else
                    {
                        ((Array)objectPr._newObj).SetValue(var, objectPr._indexMap); // Primitive type
                    }
                }
                else
                {
                    // Primitive type
                    if (objectPr._primitiveArray != null)
                    {
                        // Fast path for Soap primitive arrays. Binary was handled in the BinaryParser
                        objectPr._primitiveArray.SetValue(pr._value, objectPr._indexMap[0]);
                    }
                    else
                    {
                        object var = pr._varValue != null ?
                                     pr._varValue :
                                     Converter.FromString(pr._value, objectPr._arrayElementTypeCode);
                        if (objectPr._objectA != null)
                        {
                            objectPr._objectA[objectPr._indexMap[0]] = var;
                        }
                        else
                        {
                            ((Array)objectPr._newObj).SetValue(var, objectPr._indexMap); // Primitive type
                        }
                    }
                }
            }
            else if (pr._memberValueEnum == InternalMemberValueE.Null)
            {
                objectPr._memberIndex += pr._consecutiveNullArrayEntryCount - 1; //also incremented again below
            }
            else
            {
                ParseError(pr, objectPr);
            }

            objectPr._memberIndex++;
        }