コード例 #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());
        }
コード例 #2
0
 public void ReturnOutputBuffer(IBufferObjectDataOutput output)
 {
     if (output == null)
     {
         return;
     }
     output.Clear();
     OfferOrClose(outputQueue, output);
 }
コード例 #3
0
        /// <exception cref="System.IO.IOException"/>
        internal void WriteInternal(IBufferObjectDataOutput output, IPortable p)
        {
            var cd = _context.LookupOrRegisterClassDefinition(p);

            output.WriteInt(cd.GetVersion());
            var writer = new DefaultPortableWriter(this, output, cd);

            p.WritePortable(writer);
            writer.End();
        }
コード例 #4
0
 /// <exception cref="System.IO.IOException" />
 public DefaultPortableWriter(PortableSerializer serializer, IBufferObjectDataOutput @out, IClassDefinition cd)
 {
     this.serializer = serializer;
     this.@out = @out;
     this.cd = cd;
     writtenFields = new HashSet<string>(); //cd.GetFieldCount()
     begin = @out.Position();
     // room for final offset
     @out.WriteZeroBytes(4);
     @out.WriteInt(cd.GetFieldCount());
     offset = @out.Position();
     // one additional for raw data
     var fieldIndexesLength = (cd.GetFieldCount() + 1)*Bits.IntSizeInBytes;
     @out.WriteZeroBytes(fieldIndexesLength);
 }
コード例 #5
0
        /// <exception cref="System.IO.IOException" />
        public DefaultPortableWriter(PortableSerializer serializer, IBufferObjectDataOutput @out, IClassDefinition cd)
        {
            _serializer    = serializer;
            _out           = @out;
            _cd            = cd;
            _writtenFields = new HashSet <string>(); //cd.GetFieldCount()
            _begin         = @out.Position();
            // room for final offset
            @out.WriteZeroBytes(4);
            @out.WriteInt(cd.GetFieldCount());
            _offset = @out.Position();
            // one additional for raw data
            var fieldIndexesLength = (cd.GetFieldCount() + 1) * Bits.IntSizeInBytes;

            @out.WriteZeroBytes(fieldIndexesLength);
        }
コード例 #6
0
            internal void Push(IBufferObjectDataOutput output)
            {
                if (output == null)
                {
                    return;
                }
                output.Clear();
                ConcurrentQueue <IBufferObjectDataOutput> outputQueue;

                _map.TryGetValue(Thread.CurrentThread, out outputQueue);
                if (outputQueue == null)
                {
                    IOUtil.CloseResource(output);
                    return;
                }
                try
                {
                    outputQueue.Enqueue(output);
                }
                catch (Exception)
                {
                    IOUtil.CloseResource(output);
                }
            }
コード例 #7
0
 private void ReturnDataOutput(IBufferObjectDataOutput output) => _bufferPoolThreadLocal.Get().ReturnOutputBuffer(output);
コード例 #8
0
 protected internal void Push(IBufferObjectDataOutput output)
 {
     _dataOutputQueue.Push(output);
 }
コード例 #9
0
 public void ReturnOutputBuffer(IBufferObjectDataOutput output) => _outputPool.Return(output);