Esempio n. 1
0
 /// <summary>
 /// 写数值
 /// </summary>
 /// <param name="value">数值</param>
 /// <param name="stream"></param>
 internal void Write(ulong value, UnmanagedStream stream)
 {
     if ((Type & EncodingType.Unicode) == 0)
     {
         if ((Type & EncodingType.CompatibleAscii) != 0)
         {
             if (value < 10)
             {
                 stream.Write((byte)((int)value + '0'));
             }
             else
             {
                 byte *      write = stream.GetPrepSizeCurrent(24);
                 RangeLength index = AutoCSer.Extensions.NumberExtension.ToBytes(value, write);
                 if (index.Start != 0)
                 {
                     AutoCSer.Memory.Common.SimpleCopyNotNull64(write + index.Start, write, index.Length);
                 }
                 stream.Data.CurrentIndex += index.Length;
             }
         }
         else
         {
             char *write  = (char *)stream.GetPrepSizeCurrent(20 * sizeof(char));
             int   length = AutoCSer.Extensions.NumberExtension.ToString(value, write);
             int   size   = Encoding.GetByteCount(write, length);
             Encoding.GetBytes(write, length, (byte *)write, size);
             stream.Data.CurrentIndex += size;
         }
     }
     else
     {
         stream.Data.CurrentIndex += AutoCSer.Extensions.NumberExtension.ToString(value, (char *)stream.GetPrepSizeCurrent(20 * sizeof(char))) << 1;
     }
 }
Esempio n. 2
0
 /// <summary>
 /// 写数值
 /// </summary>
 /// <param name="value">数值</param>
 /// <param name="stream"></param>
 internal void Write(int value, UnmanagedStream stream)
 {
     if ((Type & EncodingType.Unicode) == 0)
     {
         if ((Type & EncodingType.CompatibleAscii) != 0)
         {
             if ((uint)value < 10)
             {
                 stream.Write((byte)(value + '0'));
             }
             else
             {
                 stream.Data.CurrentIndex += AutoCSer.Extensions.NumberExtension.ToBytes(value, stream.GetPrepSizeCurrent(11));
             }
         }
         else
         {
             char *write = (char *)stream.GetPrepSizeCurrent(11 * sizeof(char));
             int   count = AutoCSer.Extensions.NumberExtension.ToString(value, write);
             int   size  = Encoding.GetByteCount(write, count);
             Encoding.GetBytes(write, count, (byte *)write, size);
             stream.Data.CurrentIndex += size;
         }
     }
     else
     {
         stream.Data.CurrentIndex += AutoCSer.Extensions.NumberExtension.ToString(value, (char *)stream.GetPrepSizeCurrent(11 * sizeof(char))) * sizeof(char);
     }
 }
Esempio n. 3
0
        /// <summary>
        /// 序列化
        /// </summary>
        /// <typeparam name="valueType"></typeparam>
        /// <param name="value"></param>
        /// <param name="stream"></param>
        /// <param name="config"></param>
        internal static void Serialize <valueType>(ref valueType value, UnmanagedStream stream, SerializeConfig config)
        {
            int            index          = stream.AddSize(sizeof(int));
            JsonSerializer jsonSerializer = YieldPool.Default.Pop() ?? new JsonSerializer();

            try
            {
                jsonSerializer.serialize <valueType>(ref value, stream, config);
            }
            finally { jsonSerializer.Free(); }
            int length = stream.Data.CurrentIndex - index;

            *(int *)(stream.Data.Byte + (index - sizeof(int))) = length;
            if ((length & 2) != 0)
            {
                stream.Write(' ');
            }
        }
 /// <summary>
 /// 序列化
 /// </summary>
 /// <typeparam name="valueType">目标数据类型</typeparam>
 /// <param name="value">数据对象</param>
 /// <param name="stream"></param>
 internal void SerializeTcpServer <valueType>(ref valueType value, UnmanagedStream stream)
 {
     //CurrentMemberMap = MemberMap = null;
     //Warning = SerializeWarning.None;
     if (isReferenceMember == AutoCSer.BinarySerialize.TypeSerializer <valueType> .IsReferenceMember)
     {
         if (points != null)
         {
             points.Clear();
         }
     }
     else if (isReferenceMember)
     {
         isReferenceMember = false;
     }
     else
     {
         isReferenceMember = true;
         if (points == null)
         {
             points = ReusableDictionary <ObjectReference> .Create <int>();
         }
         else
         {
             points.Clear();
         }
     }
     //streamStartIndex = Stream.OffsetLength;
     streamStartIndex = stream.Data.CurrentIndex;
     isReferenceArray = true;
     Config.UnsafeWriteHeader(stream);
     Stream.From(stream);
     try
     {
         //Warning = SerializeWarning.None;
         AutoCSer.BinarySerialize.TypeSerializer <valueType> .SerializeTcpServer(this, ref value);
     }
     finally { stream.From(Stream); }
     //Stream.Write(Stream.OffsetLength - streamStartIndex);
     stream.Write(stream.Data.CurrentIndex - streamStartIndex);
 }
        /// <summary>
        /// 序列化
        /// </summary>
        /// <typeparam name="valueType"></typeparam>
        /// <param name="stream"></param>
        /// <param name="value"></param>
        internal void SerializeTcpServer <valueType>(ref valueType value, UnmanagedStream stream)
        //where valueType : struct
        {
            int index = stream.Data.CurrentIndex;

            if (forefatherCount != 0)
            {
                System.Array.Clear(forefather, 0, forefatherCount);
                forefatherCount = 0;
            }
            CharStream.From(stream);
            try
            {
                //Warning = SerializeWarning.None;
                TypeSerializer <valueType> .SerializeTcpServer(this, ref value);
            }
            finally { stream.From(CharStream); }
            if (((stream.Data.CurrentIndex - index) & 2) != 0)
            {
                stream.Write(' ');
            }
        }
Esempio n. 6
0
 /// <summary>
 /// URL 哈希字符
 /// </summary>
 /// <param name="stream"></param>
 internal void WriteUrlHash(UnmanagedStream stream)
 {
     if ((Type & EncodingType.CompatibleAscii) != 0)
         stream.Write(*urlHashAscii.Short); }