Пример #1
0
        public override bool Read(DeserializationContext context, out Object outVal)
        {
            uint id         = context.Reader.ReadUInt32();
            uint arrayType  = context.Reader.ReadByte();
            uint dimensions = context.Reader.ReadUInt32();

            uint[] dimSizes = new uint[dimensions];
            for (int i = 0; i < dimensions; i++)
            {
                dimSizes[i] = context.Reader.ReadUInt32();
            }

            // TODO: up to now we only support single dimension arrays
            if (dimensions > 1 || ((BinaryArrayType)arrayType != BinaryArrayType.Single))
            {
                throw new SerializationException("array dimmensions > 1 || jagged arrays NYI!");
            }

            BinaryTypeTag     typeTag  = (BinaryTypeTag)context.Reader.ReadByte();
            TypeSpecification typeSpec = ReadTypeSpec(context, typeTag);

            if (typeTag == BinaryTypeTag.PrimitiveType)
            {
                return(Read(context, id, dimSizes[0], typeSpec.GetPrimitiveType(), out outVal));
            }
            else
            {
                return(Read(context, id, dimSizes[0], typeSpec.GetObjectType(context), out outVal));
            }
        }
Пример #2
0
        public bool Read(DeserializationContext context, out Object outVal, bool external)
        {
            uint   id   = context.Reader.ReadUInt32();
            String name = context.Reader.ReadString();

            uint fieldCount = context.Reader.ReadUInt32();

            // collect the names of the fields
            String[] fieldNames = new String[fieldCount];
            for (int i = 0; i < fieldCount; i++)
            {
                fieldNames[i] = context.Reader.ReadString();
            }

            // collect the type-tags of the fields
            BinaryTypeTag[] typeTags = new BinaryTypeTag[fieldCount];
            for (int i = 0; i < fieldCount; i++)
            {
                typeTags[i] = (BinaryTypeTag)context.Reader.ReadByte();
            }

            // collect the type-specifications of the fields if necessary
            TypeSpecification[] typeSpecs = new TypeSpecification[fieldCount];
            for (int i = 0; i < fieldCount; i++)
            {
                typeSpecs[i] = ReadTypeSpec(context, typeTags[i]);
            }

            // read assembly-id if this is no runtime object
            Assembly assembly = null;

            if (external)
            {
                assembly = context.GetAssembly(context.Reader.ReadUInt32());
            }

            // store type-information for later usage
            TypeInfo typeInfo = new TypeInfo(context, name, fieldNames, typeTags, typeSpecs, assembly);

            context.SetTypeInfo(id, typeInfo);

            // let our parent read the inlined values
            return(Read(context, out outVal, id, typeInfo));
        }
	public static TypeSpecification ReadTypeSpec(DeserializationContext context, BinaryTypeTag typeTag) 
	{
		switch(typeTag) 
		{
			case BinaryTypeTag.PrimitiveType:
			case BinaryTypeTag.ArrayOfPrimitiveType:
				BinaryPrimitiveTypeCode typeCode = (BinaryPrimitiveTypeCode) context.Reader.ReadByte();
				switch(typeCode) 
				{
					case BinaryPrimitiveTypeCode.Boolean:
						return sBooleanSpec;
					case BinaryPrimitiveTypeCode.Byte:
						return sByteSpec;
					case BinaryPrimitiveTypeCode.Char:
						return sCharSpec;
					case BinaryPrimitiveTypeCode.Decimal:
						return sDecimalSpec;
					case BinaryPrimitiveTypeCode.Double:
						return sDoubleSpec;
					case BinaryPrimitiveTypeCode.Int16:
						return sInt16Spec;
					case BinaryPrimitiveTypeCode.Int32:
						return sInt32Spec;
					case BinaryPrimitiveTypeCode.Int64:
						return sInt64Spec;
					case BinaryPrimitiveTypeCode.SByte:
						return sSByteSpec;
					case BinaryPrimitiveTypeCode.Single:
						return sSingleSpec;
					case BinaryPrimitiveTypeCode.TimeSpan:
						return sTimeSpanSpec;
					case BinaryPrimitiveTypeCode.DateTime:
						return sDateTimeSpec;
					case BinaryPrimitiveTypeCode.UInt16:
						return sUInt16Spec;
					case BinaryPrimitiveTypeCode.UInt32:
						return sUInt32Spec;
					case BinaryPrimitiveTypeCode.UInt64:
						return sUInt64Spec;
					case BinaryPrimitiveTypeCode.String:
						return sStringArraySpec;
		
					default:
						throw new SerializationException("unknown primitive type code:"+typeCode);
				}
				throw new SerializationException("unknown primitive type code:"+typeCode);

			case BinaryTypeTag.RuntimeType:
				return new TypeSpecification(context.Reader.ReadString());

			case BinaryTypeTag.GenericType:
				String typeName = context.Reader.ReadString();
				uint assId = context.Reader.ReadUInt32();
				return new TypeSpecification(typeName, assId);

            case BinaryTypeTag.String:
                return sStringSpecObject;

            case BinaryTypeTag.ObjectType:
                return sObjectSpec;

            case BinaryTypeTag.ArrayOfString:
                return sStringArraySpec;

            case BinaryTypeTag.ArrayOfObject:
                return sObjectArraySpec;

			default:
				return null;
		}
	}
	public TypeInfo(DeserializationContext context, String name, String[] fieldNames,
	                BinaryTypeTag[] tt, TypeSpecification[] ts, Assembly assembly) 
	{
        mConverter = context.Formatter.converter;
		mFieldNames = fieldNames;
		mTypeTag = tt;
		mTypeSpec = ts;

		// lookup our type in the right assembly
		if(assembly == null) 
		{
			mObjectType = Type.GetType(name, true);
		} 
		else 
		{
			mObjectType = assembly.GetType(name, true);
		}

		if(typeof(ISerializable).IsAssignableFrom(mObjectType))
        {
            mIsIserializable = true;
        }
        else
        {
            mIsIserializable = false;

		    // lookup all members once
	    	mMembers = new MemberInfo[NumMembers];
    		for(int i = 0; i < NumMembers; i++) 
		    {
	    		// ms and mono have their values for boxed primitive types called 'm_value', we need a fix for that
    			if(mObjectType.IsPrimitive && (mFieldNames[i] == "m_value")) 
			    {
		    		mFieldNames[i] = "value_";
	    		}
    			else if (mObjectType == typeof(DateTime) && 
			    			(mFieldNames[i] == "ticks")) 
		    	{
	    			// this is for DateTime
    				mFieldNames[i] = "value_";
			    } 
		    	else if (mObjectType == typeof(TimeSpan) && 
	    					(mFieldNames[i] == "_ticks")) 
    			{
		    		// this is for TimeSpan
	    			mFieldNames[i] = "value_";
    			} 
			    else if (mObjectType == typeof(Decimal)) 
		    	{
	    			switch(mFieldNames[i]) 
    				{
				    	case "hi":
			    		{
		    				mFieldNames[i] = "high";
	    				}
    					break;
					    case "lo":
				    	{
			    			mFieldNames[i] = "low";
		    			}
	    				break;
    					case "mid":
					    {
				    		mFieldNames[i] = "middle";
			    		}
		    			break;
	    			}
    			}

		    	Type memberType;
	    		String memberName;
    			int classSeparator = mFieldNames[i].IndexOf('+');
			    if(classSeparator != -1) 
		    	{
	    			/*
    				*  TODO: check if there are constraints in which assembly 
				    *  the Type may be looked up! for now just look it up 
			    	*  generally
		    		*/
	    			String baseName = mFieldNames[i].Substring(0, classSeparator);
    				memberName = mFieldNames[i].Substring(classSeparator+1, mFieldNames[i].Length-classSeparator-1);
    				memberType = mObjectType;

	    			// MS does NOT store the FullQualifiedTypename if there 
    				// is no collision but only the Typename :-(
				    while(!memberType.FullName.EndsWith(baseName)) 
			    	{
		    			// check if we reached System.Object
	    				if(memberType == memberType.BaseType || memberType == null) 
    					{
						    // TODO : I18n
					    	throw new SerializationException("Can't find member "+mFieldNames[i]);
				    	}
			    		memberType = memberType.BaseType;
		    		}
	    		} 
    			else 
			    {
		    		memberType = mObjectType;
	    			memberName = mFieldNames[i];
    			}

	    		// get member from object
    			MemberInfo[] members = memberType.GetMember(memberName, 
				    							MemberTypes.Field | 
			    								MemberTypes.Property, 
		    									BindingFlags.Instance | 
	    										BindingFlags.Public | 
    											BindingFlags.NonPublic);

		    	if((members == null) || (members.Length < 1)) 
	    		{
    				// TODO: I18n
			    	throw new SerializationException("Can't find member "+mFieldNames[i]);
		    	} 
	    		else 
    			{
			    	mMembers[i] = members[0];
		    	}
	    	}
    	}
	}
	public TypeSpecification(String name) 
	{
		mClassName = name;
		mTag = BinaryTypeTag.RuntimeType;
	}
	public TypeSpecification(String name, uint ass) 
	{
		mClassName = name;
		mAssembly = ass;
		mTag = BinaryTypeTag.GenericType;
	}
	public TypeSpecification(BinaryPrimitiveTypeCode primitive) 
	{
		mPrimitiveType = primitive;
		mTag = BinaryTypeTag.PrimitiveType;
	}
	public bool Read(DeserializationContext context, out Object outVal, bool external)
	{
		uint id = context.Reader.ReadUInt32();
		String name = context.Reader.ReadString();

		uint fieldCount = context.Reader.ReadUInt32();

		// collect the names of the fields
		String[] fieldNames = new String[fieldCount];
		for(int i = 0; i < fieldCount; i++) 
		{
			fieldNames[i] = context.Reader.ReadString();
		}

		// collect the type-tags of the fields
		BinaryTypeTag[] typeTags = new BinaryTypeTag[fieldCount];
		for(int i = 0; i < fieldCount; i++) 
		{
			typeTags[i] = (BinaryTypeTag) context.Reader.ReadByte();
		}

		// collect the type-specifications of the fields if necessary
		TypeSpecification[] typeSpecs = new TypeSpecification[fieldCount];
		for(int i = 0; i < fieldCount; i++) 
		{
			typeSpecs[i] = ReadTypeSpec(context, typeTags[i]);
		}

		// read assembly-id if this is no runtime object
		Assembly assembly = null;
		if(external) 
		{
			assembly = context.GetAssembly(context.Reader.ReadUInt32());
		}

		// store type-information for later usage
		TypeInfo typeInfo = new TypeInfo(context, name, fieldNames, typeTags, typeSpecs, assembly);
		context.SetTypeInfo(id, typeInfo);

		// let our parent read the inlined values
		return Read(context, out outVal, id, typeInfo);
	}
Пример #9
0
        public static TypeSpecification ReadTypeSpec(DeserializationContext context, BinaryTypeTag typeTag)
        {
            switch (typeTag)
            {
            case BinaryTypeTag.PrimitiveType:
            case BinaryTypeTag.ArrayOfPrimitiveType:
                BinaryPrimitiveTypeCode typeCode = (BinaryPrimitiveTypeCode)context.Reader.ReadByte();
                switch (typeCode)
                {
                case BinaryPrimitiveTypeCode.Boolean:
                    return(sBooleanSpec);

                case BinaryPrimitiveTypeCode.Byte:
                    return(sByteSpec);

                case BinaryPrimitiveTypeCode.Char:
                    return(sCharSpec);

                case BinaryPrimitiveTypeCode.Decimal:
                    return(sDecimalSpec);

                case BinaryPrimitiveTypeCode.Double:
                    return(sDoubleSpec);

                case BinaryPrimitiveTypeCode.Int16:
                    return(sInt16Spec);

                case BinaryPrimitiveTypeCode.Int32:
                    return(sInt32Spec);

                case BinaryPrimitiveTypeCode.Int64:
                    return(sInt64Spec);

                case BinaryPrimitiveTypeCode.SByte:
                    return(sSByteSpec);

                case BinaryPrimitiveTypeCode.Single:
                    return(sSingleSpec);

                case BinaryPrimitiveTypeCode.TimeSpan:
                    return(sTimeSpanSpec);

                case BinaryPrimitiveTypeCode.DateTime:
                    return(sDateTimeSpec);

                case BinaryPrimitiveTypeCode.UInt16:
                    return(sUInt16Spec);

                case BinaryPrimitiveTypeCode.UInt32:
                    return(sUInt32Spec);

                case BinaryPrimitiveTypeCode.UInt64:
                    return(sUInt64Spec);

                case BinaryPrimitiveTypeCode.String:
                    return(sStringArraySpec);

                default:
                    throw new SerializationException("unknown primitive type code:" + typeCode);
                }
                throw new SerializationException("unknown primitive type code:" + typeCode);

            case BinaryTypeTag.RuntimeType:
                return(new TypeSpecification(context.Reader.ReadString()));

            case BinaryTypeTag.GenericType:
                String typeName = context.Reader.ReadString();
                uint   assId    = context.Reader.ReadUInt32();
                return(new TypeSpecification(typeName, assId));

            case BinaryTypeTag.String:
                return(sStringSpecObject);

            case BinaryTypeTag.ObjectType:
                return(sObjectSpec);

            case BinaryTypeTag.ArrayOfString:
                return(sStringArraySpec);

            case BinaryTypeTag.ArrayOfObject:
                return(sObjectArraySpec);

            default:
                return(null);
            }
        }
Пример #10
0
 public TypeSpecification(String name)
 {
     mClassName = name;
     mTag       = BinaryTypeTag.RuntimeType;
 }
Пример #11
0
 public TypeSpecification(String name, uint ass)
 {
     mClassName = name;
     mAssembly  = ass;
     mTag       = BinaryTypeTag.GenericType;
 }
Пример #12
0
 public TypeSpecification(BinaryPrimitiveTypeCode primitive)
 {
     mPrimitiveType = primitive;
     mTag           = BinaryTypeTag.PrimitiveType;
 }