Exemple #1
0
        /// <exception cref="System.IO.IOException" />
        internal static void TestDifferentClassVersionsUsingDataWriteAndRead(ISerializationService serializationService,
                                                                             ISerializationService serializationService2)
        {
            var p1   = new NamedPortable("portable-v1", 111);
            var data = serializationService.ToData(p1);
            // emulate socket write by writing data to stream
            IBufferObjectDataOutput @out = serializationService.CreateObjectDataOutput(1024);

            @out.WriteData(data);
            byte[] bytes = @out.ToByteArray();
            // emulate socket read by reading data from stream
            IBufferObjectDataInput @in = serializationService2.CreateObjectDataInput(bytes);

            data = @in.ReadData();
            // read data
            object object1 = serializationService2.ToObject <object>(data);
            // serialize new portable version
            var p2    = new NamedPortableV2("portable-v2", 123);
            var data2 = serializationService2.ToData(p2);
            // de-serialize back using old version
            object object2 = serializationService.ToObject <object>(data2);

            Assert.IsNotNull(object1, "object1 should not be null!");
            Assert.IsNotNull(object2, "object2 should not be null!");
            Assert.IsInstanceOf <NamedPortableV2>(object1, "Should be instance of NamedPortableV2: " + object1.GetType());
            Assert.IsInstanceOf <NamedPortable>(object2, "Should be instance of NamedPortable: " + object2.GetType());
        }
        /// <exception cref="System.IO.IOException"/>
        internal IPortable ReadAndInitialize(IBufferObjectDataInput @in, int factoryId, int classId)
        {
            var p = Read(@in, factoryId, classId);
            var managedContext = _context.GetManagedContext();

            return(managedContext != null ? (IPortable)managedContext.Initialize(p) : p);
        }
        private DefaultPortableReader CreateReader(IBufferObjectDataInput 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);
        }
        /// <exception cref="System.IO.IOException"></exception>
        internal DefaultPortableReader CreateReader(IBufferObjectDataInput input)
        {
            var factoryId = input.ReadInt();
            var classId   = input.ReadInt();
            var version   = input.ReadInt();

            return(CreateReader(input, factoryId, classId, version, version));
        }
 public void ReturnInputBuffer(IBufferObjectDataInput input)
 {
     if (input == null)
     {
         return;
     }
     input.Clear();
     OfferOrClose(inputQueue, input);
 }
        internal DefaultPortableReader CreateMorphingReader(IBufferObjectDataInput 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));
        }
        /// <exception cref="System.IO.IOException"/>
        private IPortable Read(IBufferObjectDataInput @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);
        }
Exemple #8
0
        public DefaultPortableReader(PortableSerializer serializer, IBufferObjectDataInput @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 HazelcastSerializationException(e);
            }
            if (fieldCount != cd.GetFieldCount())
            {
                throw new InvalidOperationException("Field count[" + fieldCount + "] in stream does not match " + cd);
            }
            _offset = @in.Position();
        }
Exemple #9
0
        /// <exception cref="System.IO.IOException" />
        internal IClassDefinition ReadClassDefinition(IBufferObjectDataInput @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 * Bits.IntSizeInBytes);
                @in.Position(pos);
                var len   = @in.ReadShort();
                var chars = new char[len];
                for (var k = 0; k < len; k++)
                {
                    chars[k] = (char)@in.ReadUnsignedByte();
                }
                var type           = (FieldType)(@in.ReadByte());
                var name           = new string(chars);
                var fieldFactoryId = 0;
                var fieldClassId   = 0;
                if (type == FieldType.Portable)
                {
                    // is null
                    if (@in.ReadBoolean())
                    {
                        register = false;
                    }
                    fieldFactoryId = @in.ReadInt();
                    fieldClassId   = @in.ReadInt();
                    if (register)
                    {
                        var fieldVersion = @in.ReadInt();
                        ReadClassDefinition(@in, fieldFactoryId, fieldClassId, fieldVersion);
                    }
                }
                else
                {
                    if (type == FieldType.PortableArray)
                    {
                        var k_1 = @in.ReadInt();
                        fieldFactoryId = @in.ReadInt();
                        fieldClassId   = @in.ReadInt();
                        if (k_1 > 0)
                        {
                            var p = @in.ReadInt();
                            @in.Position(p);
                            var fieldVersion = @in.ReadInt();
                            ReadClassDefinition(@in, fieldFactoryId, fieldClassId, fieldVersion);
                        }
                        else
                        {
                            register = false;
                        }
                    }
                }
                builder.AddField(new FieldDefinition(i, name, type, fieldFactoryId, fieldClassId));
            }
            var classDefinition = builder.Build();

            if (register)
            {
                classDefinition = RegisterClassDefinition(classDefinition);
            }
            return(classDefinition);
        }
Exemple #10
0
 public MorphingPortableReader(PortableSerializer serializer, IBufferObjectDataInput input, IClassDefinition cd)
     : base(serializer, input, cd)
 {
 }
Exemple #11
0
 private void ReturnDataInput(IBufferObjectDataInput input) => _bufferPoolThreadLocal.Get().ReturnInputBuffer(input);
Exemple #12
0
 public void ReturnInputBuffer(IBufferObjectDataInput input) => _inputPool.Return(input);
 /// <exception cref="System.IO.IOException" />
 internal IClassDefinition ReadClassDefinition(IBufferObjectDataInput @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*Bits.IntSizeInBytes);
         @in.Position(pos);
         var len = @in.ReadShort();
         var chars = new char[len];
         for (var k = 0; k < len; k++)
         {
             chars[k] = (char) @in.ReadUnsignedByte();
         }
         var type = (FieldType) (@in.ReadByte());
         var name = new string(chars);
         var fieldFactoryId = 0;
         var fieldClassId = 0;
         if (type == FieldType.Portable)
         {
             // is null
             if (@in.ReadBoolean())
             {
                 register = false;
             }
             fieldFactoryId = @in.ReadInt();
             fieldClassId = @in.ReadInt();
             if (register)
             {
                 var fieldVersion = @in.ReadInt();
                 ReadClassDefinition(@in, fieldFactoryId, fieldClassId, fieldVersion);
             }
         }
         else
         {
             if (type == FieldType.PortableArray)
             {
                 var k_1 = @in.ReadInt();
                 fieldFactoryId = @in.ReadInt();
                 fieldClassId = @in.ReadInt();
                 if (k_1 > 0)
                 {
                     var p = @in.ReadInt();
                     @in.Position(p);
                     var fieldVersion = @in.ReadInt();
                     ReadClassDefinition(@in, fieldFactoryId, fieldClassId, fieldVersion);
                 }
                 else
                 {
                     register = false;
                 }
             }
         }
         builder.AddField(new FieldDefinition(i, name, type, fieldFactoryId, fieldClassId));
     }
     var classDefinition = builder.Build();
     if (register)
     {
         classDefinition = RegisterClassDefinition(classDefinition);
     }
     return classDefinition;
 }