示例#1
0
        private DefaultPortableReader CreateReader(ObjectDataInput input, int factoryId, int classId, int version,
                                                   int portableVersion)
        {
            var effectiveVersion = version;

            if (version < 0)
            {
                effectiveVersion = _context.GetVersion();
            }
            var cd = _context.LookupClassDefinition(factoryId, classId, effectiveVersion);

            if (cd == null)
            {
                var begin = input.Position;
                cd             = _context.ReadClassDefinition(input, factoryId, classId, effectiveVersion);
                input.Position = begin;
            }
            DefaultPortableReader reader;

            if (portableVersion == effectiveVersion)
            {
                reader = new DefaultPortableReader(this, input, cd);
            }
            else
            {
                reader = new MorphingPortableReader(this, input, cd);
            }
            return(reader);
        }
示例#2
0
        /// <exception cref="System.IO.IOException"></exception>
        internal DefaultPortableReader CreateReader(ObjectDataInput input)
        {
            var factoryId = input.ReadInt();
            var classId   = input.ReadInt();
            var version   = input.ReadInt();

            return(CreateReader(input, factoryId, classId, version, version));
        }
示例#3
0
        internal DefaultPortableReader CreateMorphingReader(ObjectDataInput input)
        {
            var factoryId = input.ReadInt();
            var classId   = input.ReadInt();
            var version   = input.ReadInt();

            var portable        = CreateNewPortableInstance(factoryId, classId);
            var portableVersion = FindPortableVersion(factoryId, classId, portable);

            return(CreateReader(input, factoryId, classId, version, portableVersion));
        }
示例#4
0
        /// <exception cref="System.IO.IOException"/>
        internal IPortable Read(ObjectDataInput @in, int factoryId, int classId)
        {
            var version         = @in.ReadInt();
            var portable        = CreateNewPortableInstance(factoryId, classId);
            var portableVersion = FindPortableVersion(factoryId, classId, portable);
            var reader          = CreateReader(@in, factoryId, classId, version, portableVersion);

            portable.ReadPortable(reader);
            reader.End();
            return(portable);
        }
        public DefaultPortableReader(PortableSerializer serializer, ObjectDataInput @in, IClassDefinition cd)
        {
            _in        = @in;
            Serializer = serializer;
            Cd         = cd;
            int fieldCount;

            try
            {
                // final position after portable is read
                _finalPosition = @in.ReadInt();
                // field count
                fieldCount = @in.ReadInt();
            }
            catch (IOException e)
            {
                throw new SerializationException(e);
            }
            if (fieldCount != cd.GetFieldCount())
            {
                throw new InvalidOperationException("Field count[" + fieldCount + "] in stream does not match " + cd);
            }
            _offset = @in.Position;
        }
示例#6
0
 private static void ReturnDataInput(ObjectDataInput input)
 {
     //TODO pooling
     input.Dispose();
 }
        /// <exception cref="System.IO.IOException" />
        internal IClassDefinition ReadClassDefinition(ObjectDataInput @in, int factoryId, int classId,
                                                      int version)
        {
            var register = true;
            var builder  = new ClassDefinitionBuilder(factoryId, classId, version);

            // final position after portable is read
            @in.ReadInt();
            // field count
            var fieldCount = @in.ReadInt();
            var offset     = @in.Position;

            for (var i = 0; i < fieldCount; i++)
            {
                var pos = @in.ReadInt(offset + i * BytesExtensions.SizeOfInt);
                @in.Position = pos;
                var len   = @in.ReadShort();
                var chars = new char[len];
                for (var k = 0; k < len; k++)
                {
                    chars[k] = (char)@in.ReadByte();
                }
                var type           = (FieldType)(@in.ReadByte());
                var name           = new string(chars);
                var fieldFactoryId = 0;
                var fieldClassId   = 0;
                int fieldVersion   = version;
                if (type == FieldType.Portable)
                {
                    // is null
                    if (@in.ReadBoolean())
                    {
                        register = false;
                    }
                    fieldFactoryId = @in.ReadInt();
                    fieldClassId   = @in.ReadInt();
                    if (register)
                    {
                        fieldVersion = @in.ReadInt();
                        ReadClassDefinition(@in, fieldFactoryId, fieldClassId, fieldVersion);
                    }
                }
                else
                {
                    if (type == FieldType.PortableArray)
                    {
                        var k1 = @in.ReadInt();
                        fieldFactoryId = @in.ReadInt();
                        fieldClassId   = @in.ReadInt();
                        if (k1 > 0)
                        {
                            var p = @in.ReadInt();
                            @in.Position = p;
                            fieldVersion = @in.ReadInt();
                            ReadClassDefinition(@in, fieldFactoryId, fieldClassId, fieldVersion);
                        }
                        else
                        {
                            register = false;
                        }
                    }
                }
                builder.AddField(new FieldDefinition(i, name, type, fieldFactoryId, fieldClassId, fieldVersion));
            }
            var classDefinition = builder.Build();

            if (register)
            {
                classDefinition = RegisterClassDefinition(classDefinition);
            }
            return(classDefinition);
        }