Example #1
0
 /// <summary>
 /// 字符串序列化
 /// </summary>
 /// <param name="stream">序列化数据流</param>
 /// <param name="array">数据,不能为null</param>
 internal static void Serialize(UnmanagedStream stream, string[] array)
 {
     AutoCSer.BinarySerialize.SerializeArrayMap arrayMap = new AutoCSer.BinarySerialize.SerializeArrayMap(stream, array.Length, 0);
     foreach (string value in array)
     {
         arrayMap.Next(value != null);
     }
     arrayMap.End(stream);
     foreach (string value in array)
     {
         if (value != null)
         {
             if (value.Length == 0)
             {
                 stream.Write(0);
             }
             else
             {
                 fixed(char *valueFixed = value) AutoCSer.BinarySerialize.Serializer.Serialize(valueFixed, stream, value.Length);
             }
         }
     }
 }
Example #2
0
        /// <summary>
        /// 创建命令输入数据
        /// </summary>
        /// <param name="buildInfo">TCP 客户端创建命令参数</param>
        /// <returns>是否成功</returns>
        internal unsafe override CommandBase Build(ref SenderBuildInfo buildInfo)
        {
            UnmanagedStream stream = Socket.OutputSerializer.Stream;

            if ((buildInfo.SendBufferSize - stream.ByteSize) >= sizeof(int) * 3)
            {
                CommandBase nextBuild = LinkNext;
                byte *      write     = stream.CurrentData;
                *(int *)write = Server.CancelKeepCommandIndex;
                *(int *)(write + sizeof(int)) = cancelCommandIndex;
                *(int *)(write + (sizeof(uint) + sizeof(int))) = 0;
                stream.ByteSize += sizeof(int) * 3;
                ++buildInfo.Count;

                Socket   = null;
                LinkNext = null;
                AutoCSer.Threading.RingPool <CancelKeepCommand> .Default.PushNotNull(this);

                return(nextBuild);
            }
            buildInfo.isFullSend = 1;
            return(this);
        }
Example #3
0
        /// <summary>
        /// 创建命令输入数据
        /// </summary>
        /// <param name="buildInfo">TCP 客户端创建命令参数</param>
        /// <returns>是否成功</returns>
        internal unsafe override CommandBase Build(ref SenderBuildInfo buildInfo)
        {
            UnmanagedStream stream = Socket.OutputSerializer.Stream;

            if ((buildInfo.SendBufferSize - stream.ByteSize) >= sizeof(int) + sizeof(uint))
            {
                byte *      write     = stream.CurrentData;
                CommandBase nextBuild = LinkNext;
                *(int *)write = CommandInfo.Command;
                //*(uint*)(write + sizeof(int)) = (CommandIndex & Server.CommandIndexAnd) | (uint)(CommandInfo.CommandFlags | CommandFlags.NullData);
                *(uint *)(write + sizeof(int)) = (uint)(CommandInfo.CommandFlags | CommandFlags.NullData);
                ++buildInfo.Count;
                stream.ByteSize += sizeof(int) + sizeof(uint);

                Socket   = null;
                LinkNext = null;
                AutoCSer.Threading.RingPool <SendOnlyCommand> .Default.PushNotNull(this);

                return(nextBuild);
            }
            buildInfo.isFullSend = 1;
            return(this);
        }
Example #4
0
        /// <summary>
        /// 创建命令输入数据
        /// </summary>
        /// <param name="buildInfo">TCP 客户端创建命令参数</param>
        /// <returns>下一个命令</returns>
        internal unsafe override CommandBase Build(ref SenderBuildInfo buildInfo)
        {
            UnmanagedStream stream = Socket.OutputSerializer.Stream;

            if ((buildInfo.SendBufferSize - stream.Data.CurrentIndex) >= sizeof(int) + sizeof(uint))
            {
                CommandBase nextBuild    = LinkNext;
                int         commandIndex = Socket.CommandPool.Push(this);
                if (commandIndex != 0)
                {
                    stream.Data.Write(CommandInfo.Command, (uint)commandIndex | (uint)(CommandInfo.CommandFlags | CommandFlags.NullData));
                    ++buildInfo.Count;
                    LinkNext = null;
                    return(nextBuild);
                }
                LinkNext             = null;
                OutputParameter.Type = ReturnType.ClientBuildError;
                setTask();
                return(nextBuild);
            }
            buildInfo.isFullSend = 1;
            return(this);
        }
Example #5
0
 /// <summary>
 /// 设置输出数据
 /// </summary>
 /// <param name="bodyStream"></param>
 internal unsafe void SetBody(UnmanagedStream bodyStream)
 {
     if (bodyStream.ByteSize == 0)
     {
         SetBody();
     }
     else
     {
         freeBody();
         bodyStream.GetSubBuffer(ref SubBuffer, 0);
         if (SubBuffer.PoolBuffer.Pool == null)
         {
             Body.Array       = SubBuffer.Buffer;
             Type             = ResponseType.ByteArray;
             SubBuffer.Buffer = null;
         }
         else
         {
             Body.Set(SubBuffer.Buffer, SubBuffer.StartIndex, bodyStream.ByteSize);
             Type = ResponseType.SubBuffer;
         }
     }
 }
Example #6
0
 /// <summary>
 /// 序列化
 /// </summary>
 /// <param name="stream"></param>
 internal void BinarySerialize(UnmanagedStream stream)
 {
     if (map == null)
     {
         stream.Write(0);
     }
     else
     {
         stream.PrepLength(Type.BinarySerializeSize + sizeof(int));
         byte *data = stream.CurrentData, read = map;
         *(int *)data = Type.FieldCount;
         data        += sizeof(int);
         for (byte *end = map + (Type.BinarySerializeSize & (int.MaxValue - sizeof(ulong) + 1)); read != end; read += sizeof(ulong), data += sizeof(ulong))
         {
             *(ulong *)data = *(ulong *)read;
         }
         if ((Type.BinarySerializeSize & sizeof(int)) != 0)
         {
             *(uint *)data = *(uint *)read;
         }
         stream.ByteSize += Type.BinarySerializeSize + sizeof(int);
         //stream.PrepLength();
     }
 }
Example #7
0
        /// <summary>
        /// 创建输出信息
        /// </summary>
        /// <param name="sender">TCP 服务套接字数据发送</param>
        /// <param name="buildInfo">输出创建参数</param>
        internal override OutputLink Build(TcpServer.ServerSocketSenderBase sender, ref TcpServer.SenderBuildInfo buildInfo)
        {
            UnmanagedStream stream = sender.OutputSerializer.Stream;

            if (stream.ByteSize == 0 || (buildInfo.SendBufferSize - stream.ByteSize) >= outputInfo.MaxDataSize)
            {
                ulong      markData     = sender.ServerSocket.MarkData;
                int        streamLength = stream.ByteSize;
                OutputLink nextBuild    = LinkNext;
                stream.PrepLength(sizeof(int) * 2);
                stream.ByteSize += sizeof(int);
                if (outputInfo.IsJsonSerialize == 0)
                {
                    sender.Serialize(outputInfo, ref outputParameter);
                }
                else
                {
                    sender.JsonSerialize(ref outputParameter);
                }
                int   dataLength = stream.ByteSize - streamLength - sizeof(int);
                byte *dataStart  = stream.Data.Byte + streamLength;
                *(int *)dataStart = dataLength + OutputDataSize;
                if (markData != 0)
                {
                    TcpServer.CommandBase.Mark(dataStart + sizeof(int), markData, dataLength);
                }
                outputInfo.CheckMaxDataSize(Math.Max(dataLength + sizeof(int), stream.LastPrepSize - streamLength));
                LinkNext        = null;
                outputParameter = default(outputParameterType);
                AutoCSer.Threading.RingPool <Output <outputParameterType> > .Default.PushNotNull(this);

                return(nextBuild);
            }
            buildInfo.isFullSend = 1;
            return(this);
        }
Example #8
0
 /// <summary>
 /// 缓存快照
 /// </summary>
 /// <param name="cache">缓存管理</param>
 /// <param name="isLoadArraySize"></param>
 internal Cache(AutoCSer.CacheServer.CacheManager cache, bool isLoadArraySize)
 {
     if (cache.Array.Length != 0)
     {
         dataStructures = cache.DataStructures.Values
                          .getLeftArray(value => new ServerDataStructure(value))
                          .GetSortDesc(value => value.Identity.Index);
         if (isLoadArraySize)
         {
             array = cache.Array.copy();
             cache.FreeIndexs.SortDesc();
             step = 1;
         }
         else
         {
             step = 2;
         }
         stream = new UnmanagedStream(64 << 10);
     }
     else
     {
         step = 4;
     }
 }
Example #9
0
 internal void FreeSerializer()
 {
     OutputStream = null;
     if (ReceiveDeSerializer != null)
     {
         ReceiveDeSerializer.Free();
         ReceiveDeSerializer = null;
     }
     if (ReceiveJsonParser != null)
     {
         ReceiveJsonParser.Free();
         ReceiveJsonParser = null;
     }
     if (OutputSerializer != null)
     {
         OutputSerializer.Free();
         OutputSerializer = null;
     }
     if (OutputJsonSerializer != null)
     {
         OutputJsonSerializer.Free();
         OutputJsonSerializer = null;
     }
 }
Example #10
0
        /// <summary>
        /// 序列化数据
        /// </summary>
        /// <param name="stream"></param>
        internal unsafe void Serialize(UnmanagedStream stream)
        {
            int startIndex;

            switch (step)
            {
            case CacheGetStep.Snapshot:
                startIndex = stream.AddSize(sizeof(int));
                snapshot.CopyTo(stream);
                do
                {
                    snapshotSize = snapshot.NextSize();
                }while (snapshotSize != 0 && snapshot.TryCopyTo(stream));
                timeout = Date.Now.AddTicks(timeoutTicks);
                *(int *)(stream.Data.Byte + (startIndex - sizeof(int))) = stream.ByteSize - startIndex;
                if (snapshotSize != 0)
                {
                    if (!onCache.Callback(new CacheReturnParameter {
                        Getter = this
                    }))
                    {
                        error();
                        *(int *)(stream.Data.Byte + (startIndex - sizeof(int))) = AutoCSer.BinarySerialize.Serializer.NullValue;
                        stream.ByteSize = startIndex;
                    }
                    return;
                }
                snapshot = null;
                step     = CacheGetStep.TcpQueue;
                Cache.TcpServer.CallQueue.Add(new ServerCall.CacheGetterGetQueue(this));
                return;

            case CacheGetStep.TcpQueue:
                startIndex = stream.AddSize(sizeof(int));
                currentQueue.CopyTo(stream);
                do
                {
                    currentQueue = currentQueue.LinkNext;
                }while (currentQueue != null && currentQueue.TryCopyTo(stream));
                timeout = Date.Now.AddTicks(timeoutTicks);
                *(int *)(stream.Data.Byte + (startIndex - sizeof(int))) = stream.ByteSize - startIndex;
                if (currentQueue != null)
                {
                    if (!onCache.Callback(new CacheReturnParameter {
                        Getter = this
                    }))
                    {
                        error();
                        *(int *)(stream.Data.Byte + (startIndex - sizeof(int))) = AutoCSer.BinarySerialize.Serializer.NullValue;
                        stream.ByteSize = startIndex;
                    }
                    return;
                }
                Cache.TcpServer.CallQueue.Add(new ServerCall.CacheGetterGetQueue(this));
                return;

            case CacheGetStep.Loaded: stream.Write(0); return;

            case CacheGetStep.Error: stream.Write(AutoCSer.BinarySerialize.Serializer.NullValue); return;
            }
        }
 /// <summary>
 /// 数据序列化
 /// </summary>
 /// <param name="stream"></param>
 internal abstract void Serialize(UnmanagedStream stream);
Example #12
0
 protected void repsonseCall <callType>(callType call, ref UnmanagedStream responseStream)
     where callType : AutoCSer.WebView.Call <callType>
 {
     call.RepsonseEnd(ref responseStream);
 }
Example #13
0
 protected void repsonseCall(AutoCSer.WebView.Call call, ref UnmanagedStream responseStream)
 {
     call.RepsonseEnd(ref responseStream);
 }
Example #14
0
 /// <summary>
 /// 序列化数据结构定义信息
 /// </summary>
 /// <param name="stream"></param>
 internal abstract void SerializeDataStructure(UnmanagedStream stream);
        /// <summary>
        /// 序列化操作
        /// </summary>
        /// <param name="serializer"></param>
        internal void Serialize(AutoCSer.BinarySerialize.Serializer serializer)
        {
            UnmanagedStream             stream = serializer.Stream;
            byte *                      start = stream.CurrentData, write = start + sizeof(int);
            int                         freeCount = (stream.FreeSize - sizeof(int) * 2) / (sizeof(int) * 3), outputCount = 0;
            ServerCustomSerializeBuffer buffer;

            do
            {
                AutoCSer.Threading.Interlocked.CompareExchangeYield(ref bufferLock);
                if (headBuffer == null)
                {
                    buffer        = currentBuffer;
                    currentBuffer = null;
                    System.Threading.Interlocked.Exchange(ref bufferLock, 0);
                    if (buffer == null)
                    {
                        Interlocked.Exchange(ref isOutput, 0);
                        if ((headBuffer == null && currentBuffer == null) || Interlocked.CompareExchange(ref isOutput, 1, 0) != 0)
                        {
                            stream.MoveSize(*(int *)start = (outputCount * (sizeof(int) * 3)) + sizeof(int));
                            return;
                        }
                        continue;
                    }
                }
                else
                {
                    buffer = headBuffer;
                    if ((headBuffer = headBuffer.LinkNext) == null)
                    {
                        headBuffer = endBuffer = null;
                        System.Threading.Interlocked.Exchange(ref bufferLock, 0);
                    }
                    else
                    {
                        System.Threading.Interlocked.Exchange(ref bufferLock, 0);
                        buffer.LinkNext = null;
                    }
                }
                int bufferCount = buffer.Size / (sizeof(int) * 2);
                if (bufferCount > freeCount)
                {
                    onCustomSerialize.Callback(new ServerCustomSerialize {
                        Output = this
                    });
                    write = buffer.Serialize(write, freeCount);
                    AutoCSer.Threading.Interlocked.CompareExchangeYield(ref bufferLock);
                    if (headBuffer == null)
                    {
                        endBuffer = buffer;
                    }
                    else
                    {
                        buffer.LinkNext = headBuffer;
                    }
                    headBuffer = buffer;
                    System.Threading.Interlocked.Exchange(ref bufferLock, 0);
                    stream.MoveSize(*(int *)start = ((outputCount + freeCount) * (sizeof(int) * 3)) + sizeof(int));
                    return;
                }
                write = buffer.Serialize(write);
                AutoCSer.Threading.Interlocked.CompareExchangeYield(ref freeBufferLock);
                buffer.LinkNext = freeBuffer;
                freeBuffer      = buffer;
                System.Threading.Interlocked.Exchange(ref freeBufferLock, 0);
                outputCount += bufferCount;
                if ((freeCount -= bufferCount) == 0)
                {
                    stream.MoveSize(*(int *)start = (outputCount * (sizeof(int) * 3)) + sizeof(int));
                    if (headBuffer == null && currentBuffer == null)
                    {
                        Interlocked.Exchange(ref isOutput, 0);
                        if ((headBuffer == null && currentBuffer == null) || Interlocked.CompareExchange(ref isOutput, 1, 0) != 0)
                        {
                            return;
                        }
                    }
                    onCustomSerialize.Callback(new ServerCustomSerialize {
                        Output = this
                    });
                    return;
                }
            }while (true);
        }
Example #16
0
 public unsafe static DeSerializeResult deSerialize <valueType>(this valueType value, UnmanagedStream data, int startIndex = 0, DeSerializeConfig config = null)
 {
     if (data == null)
     {
         return new DeSerializeResult {
                    State = DeSerializeState.UnknownData
         }
     }
     ;
     return(DeSerializer.DeSerialize <valueType>(null, data.Data.Byte + startIndex, data.ByteSize - startIndex, ref value, config));
 }
Example #17
0
 internal void CopyTo(UnmanagedStream stream)
 {
     stream.WriteNotEmpty(this.stream.Data.Byte, this.stream.Data.CurrentIndex);
 }
Example #18
0
 private static void enumULong <valueType>(UnmanagedStream stream, valueType value)
 {
     stream.UnsafeWrite(Emit.EnumCast <valueType, ulong> .ToInt(value));
 }
Example #19
0
 private static void serialize(UnmanagedStream stream, sbyte value)
 {
     stream.Data.Write(value);
 }
Example #20
0
 private static void enumShort <valueType>(UnmanagedStream stream, valueType value)
 {
     stream.UnsafeWrite(Emit.EnumCast <valueType, short> .ToInt(value));
 }
Example #21
0
 private static void serialize(UnmanagedStream stream, Guid value)
 {
     stream.Data.Write(ref value);
 }
Example #22
0
 private static void serialize(UnmanagedStream stream, bool?value)
 {
     stream.Data.Write(value.HasValue ? ((bool)value ? (byte)2 : (byte)1) : (byte)0);
 }
Example #23
0
        public void ResetReadFault()
        {
            UnmanagedStream bs = new UnmanagedStream();

            Assert.Catch <InvalidOperationException>(() => { bs.ResetRead(); });
        }
Example #24
0
 /// <summary>
 /// 序列化数据结构定义信息
 /// </summary>
 /// <param name="stream"></param>
 internal override void SerializeDataStructure(UnmanagedStream stream)
 {
     stream.Write((ushort)((byte)Abstract.NodeType.Value + ((int)(byte)ValueData.DataType.BinarySerialize << 8)));
     serializeParentDataStructure(stream);
 }
Example #25
0
 /// <summary>
 /// 序列化数据结构定义信息
 /// </summary>
 /// <param name="stream"></param>
 internal override void SerializeDataStructure(UnmanagedStream stream)
 {
     stream.Write((byte)Abstract.NodeType.FragmentDictionary);
     stream.Write((byte)ValueData.Data <keyType> .DataType);
     serializeParentDataStructure(stream);
 }
Example #26
0
 internal void CopyTo(UnmanagedStream stream)
 {
     stream.Write(ref Array);
     FreeReference();
 }
Example #27
0
 /// <summary>
 /// 序列化数据结构定义信息
 /// </summary>
 /// <param name="stream"></param>
 internal override void SerializeDataStructure(UnmanagedStream stream)
 {
     stream.Write((byte)Abstract.NodeType.Array);
     serializeParentDataStructure(stream);
 }
Example #28
0
 /// <summary>
 /// WEB 调用同步处理
 /// </summary>
 /// <param name="call"></param>
 /// <param name="responseStream"></param>
 /// <returns></returns>
 protected virtual bool call(AutoCSer.WebView.CallBase call, ref UnmanagedStream responseStream)
 {
     return(false);
 }
Example #29
0
 /// <summary>
 /// 序列化数据结构定义信息
 /// </summary>
 /// <param name="stream"></param>
 internal override void SerializeDataStructure(UnmanagedStream stream)
 {
     stream.Write((byte)Abstract.NodeType.MessageQueueConsumer);
     stream.Write((byte)ValueData.Data <valueType> .DataType);
     serializeParentDataStructure(stream);
 }
Example #30
0
 internal void UnsafeSerialize(UnmanagedStream stream)
 {
     UnsafeSerialize(stream.CurrentData);
     stream.ByteSize += SerializeSize;
 }