示例#1
0
        private unsafe static void serialize(fastCSharp.emit.dataSerializer serializer, fileBlockMember <valueType> value)
        {
            int indexCustom = value.index.Custom;

            if ((indexCustom & (int)custom.Serialize) == 0)
            {
                if (value.index.Size == 0)
                {
                    serializer.Stream.Write(fastCSharp.emit.binarySerializer.NullValue);
                }
                else
                {
                    unmanagedStream stream = serializer.Stream;
                    stream.PrepLength(sizeof(int) * 2 + sizeof(long));
                    byte *data = stream.CurrentData;
                    *(int *)data = (emit.pub.PuzzleValue & 0x7fffff00) + indexCustom;
                    *(int *)(data + sizeof(int))      = value.index.Size;
                    *(long *)(data + sizeof(int) * 2) = value.index.Index;
                    stream.UnsafeAddLength(sizeof(int) * 2 + sizeof(long));
                    stream.PrepLength();
                }
            }
            else if (value.value == null)
            {
                serializer.Stream.Write(fastCSharp.emit.binarySerializer.NullValue);
            }
            else
            {
                serializer.Stream.Write(indexCustom);
                fastCSharp.emit.dataSerializer.typeSerializer <valueType> .Serialize(serializer, value.value);
            }
        }
示例#2
0
            /// <summary>
            /// 文本转HTML
            /// </summary>
            /// <param name="value">文本值</param>
            /// <param name="stream">HTML编码流</param>
            public unsafe void ToHtml(ref subString value, unmanagedStream stream)
            {
                if (value.Length != 0)
                {
                    if (stream == null)
                    {
                        log.Error.Throw(log.exceptionType.Null);
                    }
                    int length = value.Length;
                    fixed(char *valueFixed = value.value)
                    {
                        char *start = valueFixed + value.StartIndex, end = start + length;
                        int   count = encodeCount(start, end);

                        if (count == 0)
                        {
                            stream.PrepLength(length <<= 1);
                            unsafer.memory.Copy(start, stream.CurrentData, length);
                        }
                        else
                        {
                            length += count << 2;
                            stream.PrepLength(length <<= 1);
                            toHtml(start, end, (char *)stream.CurrentData);
                        }
                        stream.UnsafeAddLength(length);
                    }
                }
            }
示例#3
0
 /// <summary>
 /// 格式化ajax字符串
 /// </summary>
 /// <param name="jsStream">JS字符流</param>
 /// <param name="formatStream">格式化JSON字符流</param>
 internal unsafe static void FormatJavascript(charStream jsStream, unmanagedStream formatStream)
 {
     if (jsStream.Length != 0)
     {
         char *start  = jsStream.Char;
         int   length = formatLength(jsStream);
         if (length == 0)
         {
             char *end = start + (length = jsStream.Length);
             formatStream.PrepLength(length <<= 1);
             for (char *write = (char *)(formatStream.CurrentData); start != end; ++start)
             {
                 *write++ = *start == Quote ? '"' : *start;
             }
             formatStream.UnsafeAddLength(length);
         }
         else
         {
             length += jsStream.Length;
             formatStream.PrepLength(length <<= 1);
             formatJavascript(start, start + jsStream.Length, (char *)(formatStream.CurrentData));
             formatStream.UnsafeAddLength(length);
         }
     }
 }
示例#4
0
 /// <summary>
 /// 序列化
 /// </summary>
 /// <param name="stream"></param>
 /// <param name="map"></param>
 /// <param name="fieldCount"></param>
 internal static void FieldSerialize(unmanagedStream stream, ulong map, int fieldCount)
 {
     if (map == 0)
     {
         stream.Write(0);
     }
     else
     {
         stream.PrepLength(sizeof(int) + sizeof(ulong));
         byte *data = stream.CurrentData;
         *(int *)data = fieldCount;
         *(ulong *)(data + sizeof(int)) = map;
         stream.UnsafeAddLength(sizeof(int) + sizeof(ulong));
         stream.PrepLength();
     }
 }
示例#5
0
 /// <summary>
 /// 中文分词词语集合写入文本文件
 /// </summary>
 private unsafe static void writeTxtFile()
 {
     string[] words = Words;
     using (unmanagedStream wordStream = new unmanagedStream())
     {
         *(int *)wordStream.Data = words.Length;
         wordStream.UnsafeAddLength(sizeof(int));
         foreach (string word in words)
         {
             wordStream.Write(word);
             wordStream.Write((char)0);
         }
         subArray <byte> data = io.compression.stream.Deflate.GetCompress(wordStream.GetArray(), 0);
         using (FileStream fileStream = new FileStream(fastCSharp.config.search.Default.WordTxtFileName, FileMode.Create, FileAccess.Write, FileShare.None))
         {
             fileStream.Write(data.UnsafeArray, data.StartIndex, data.Count);
         }
     }
 }
示例#6
0
        /// <summary>
        /// 保存TCP服务信息集合到缓存文件
        /// </summary>
        internal unsafe void SaveCacheFile()
        {
            cache cache = new cache();

            byte[] buffer = fastCSharp.memoryPool.StreamBuffers.Get();
            try
            {
                fixed(byte *bufferFixed = buffer)
                {
                    using (unmanagedStream stream = new unmanagedStream(bufferFixed, buffer.Length))
                    {
                        Monitor.Enter(serviceLock);
                        try
                        {
                            cache.Services  = serviceCache.Values.getArray();
                            cache.HostPorts = hostPorts.getArray(value => new keyValue <string, int>(value.Key.ToString(), value.Value));
                            fastCSharp.emit.dataSerializer.Serialize(cache, stream);
                            if (stream.data.data == bufferFixed)
                            {
                                using (FileStream file = new FileStream(cacheFile, FileMode.Create, FileAccess.Write, FileShare.None))
                                {
                                    file.Write(buffer, 0, stream.Length);
                                }
                            }
                            else
                            {
                                File.WriteAllBytes(cacheFile, stream.GetArray());
                            }
                        }
                        finally
                        {
                            isSaveCacheFile = 0;
                            Monitor.Exit(serviceLock);
                        }
                    }
                }
            }
            finally { fastCSharp.memoryPool.StreamBuffers.PushNotNull(buffer); }
        }
示例#7
0
 /// <summary>
 /// 获取解压数据
 /// </summary>
 /// <returns>解压数据</returns>
 public unsafe subArray <byte> Get(memoryPool memoryPool)
 {
     if (memoryPool == null)
     {
         pointer data = fastCSharp.unmanagedPool.StreamBuffers.Get();
         try
         {
             using (dataStream = new unmanagedStream(data.Byte, fastCSharp.unmanagedPool.StreamBuffers.Size))
             {
                 get();
                 return(new subArray <byte>(dataStream.GetArray()));
             }
         }
         finally { fastCSharp.unmanagedPool.StreamBuffers.Push(ref data); }
     }
     else
     {
         byte[] data = memoryPool.Get();
         try
         {
             fixed(byte *dataFixed = data)
             {
                 using (dataStream = new unmanagedStream(dataFixed, data.Length))
                 {
                     get();
                     if (dataStream.data.data == dataFixed)
                     {
                         byte[] buffer = data;
                         data = null;
                         return(subArray <byte> .Unsafe(buffer, 0, dataStream.Length));
                     }
                     return(new subArray <byte>(dataStream.GetArray()));
                 }
             }
         }
         finally { memoryPool.PushOnly(data); }
     }
 }
示例#8
0
 /// <summary>
 /// 序列化
 /// </summary>
 /// <param name="stream"></param>
 /// <param name="map"></param>
 /// <param name="type"></param>
 internal static void FieldSerialize(unmanagedStream stream, byte *map, type type)
 {
     if (map == null)
     {
         stream.Write(0);
     }
     else
     {
         stream.PrepLength(type.FieldSerializeSize + sizeof(int));
         byte *data = stream.CurrentData, read = map;
         *(int *)data = type.FieldCount;
         data        += sizeof(int);
         for (byte *end = map + (type.FieldSerializeSize & (int.MaxValue - sizeof(ulong) + 1)); read != end; read += sizeof(ulong), data += sizeof(ulong))
         {
             *(ulong *)data = *(ulong *)read;
         }
         if ((type.FieldSerializeSize & sizeof(int)) != 0)
         {
             *(uint *)data = *(uint *)read;
         }
         stream.UnsafeAddLength(type.FieldSerializeSize + sizeof(int));
         stream.PrepLength();
     }
 }
示例#9
0
 /// <summary>
 /// 字段成员序列化
 /// </summary>
 /// <param name="stream"></param>
 internal abstract void FieldSerialize(unmanagedStream stream);
示例#10
0
        /// <summary>
        /// 获取C#计算哈希代码
        /// </summary>
        /// <param name="keyName">关键字变量名称</param>
        /// <returns>C#计算哈希代码</returns>
        public unsafe string Code(string keyName = "key")
        {
            if (indexs == null)
            {
                return(string.Empty);
            }
            using (unmanagedStream code = new unmanagedStream())
            {
                if (indexs.Length == 0)
                {
                    code.Write(@"fixed (char* keyFixed = ");
                    code.Write(keyName);
                    code.Write(@")
{
");
                }
                code.Write("    uint code = ");
                bool isFirst = true;
                if (indexs.Length == 0)
                {
                    code.Write("(uint)fastCSharp.algorithm.hashCode.GetHashCode(keyFixed, ");
                    code.Write(keyName);
                    code.Write(@" << 1)");
                }
                else
                {
                    int shiftBit = bit * (indexs.Length - 1);
                    foreach (index index in indexs)
                    {
                        if (isFirst)
                        {
                            isFirst = false;
                        }
                        else
                        {
                            code.Write(" + ");
                        }
                        code.Write("(uint)");
                        if (shiftBit != 0)
                        {
                            code.Write('(');
                        }
                        if (sub != 0)
                        {
                            code.Write('(');
                        }
                        code.Write(keyName);
                        code.Write('[');
                        switch (index.Type)
                        {
                        case index.type.Left:
                            code.Write(index.Index.toString());
                            break;

                        case index.type.Right:
                            code.Write(keyName);
                            code.Write(".Length - ");
                            code.Write((index.Index + 1).toString());
                            break;

                        default:
                            code.Write(keyName);
                            code.Write(".Length >> ");
                            code.Write(index.Index.toString());
                            break;
                        }
                        code.Write(']');
                        if (sub != 0)
                        {
                            code.Write(" - ");
                            code.Write(sub.toString());
                            code.Write(')');
                        }
                        if (shiftBit != 0)
                        {
                            code.Write(" << ");
                            code.Write(shiftBit.toString());
                            code.Write(')');
                            shiftBit -= bit;
                        }
                    }
                }
                code.Write(@";
    return (int)((");
                isFirst = true;
                foreach (int shift in shifts)
                {
                    if (isFirst)
                    {
                        isFirst = false;
                    }
                    else
                    {
                        code.Write(" ^ ");
                    }
                    if (shift != 0)
                    {
                        code.Write('(');
                    }
                    code.Write("code");
                    if (shift != 0)
                    {
                        code.Write(" >> ");
                        code.Write(shift.toString());
                        code.Write(')');
                    }
                }
                code.Write(") & ((1U << ");
                code.Write(minSize.toString());
                code.Write(") - 1))");
                if (!isMaxCode && minCode != 0)
                {
                    code.Write(" - ");
                    code.Write(minCode.toString());
                }
                code.Write(';');
                if (indexs.Length == 0)
                {
                    code.Write(@"
}");
                }
                return(code.ToString());
            }
        }
 /// <summary>
 /// 写入文件数据
 /// </summary>
 /// <param name="stream">文件数据流</param>
 /// <returns>是否成功</returns>
 public unsafe bool Write(unmanagedStream stream)
 {
     try
     {
         if (fileWriter.UnsafeWrite(stream.Data, stream.Length) >= 0) return true;
         dispose(fileWriter.LastException);
     }
     catch (Exception error)
     {
         dispose(error);
     }
     return false;
 }
示例#12
0
 /// <summary>
 /// 发送消息
 /// </summary>
 /// <param name="webSocket"></param>
 internal unsafe void Send(webSocket.socket webSocket)
 {
     byte[] buffer = fastCSharp.memoryPool.StreamBuffers.Get();
     webSocket.socket.message message = default(webSocket.socket.message);
     try
     {
         fixed(byte *bufferFixed = buffer)
         {
             using (unmanagedStream stream = new unmanagedStream(bufferFixed, buffer.Length))
             {
                 sender sender = new sender {
                     Buffer = buffer, BufferFixed = bufferFixed, Stream = stream
                 };
                 do
                 {
                     if (webSocket == this.WebSocket && webSocket.SocketIdentity == socket.identity)
                     {
                         if (webSocket.GetMessage(ref message))
                         {
                             sender.Send(ref message);
                             if ((stream.Length << 1) > buffer.Length)
                             {
                                 byte[] data = sender.GetData();
                                 Monitor.Enter(sendLock);
                                 try
                                 {
                                     webSocket.SslStream.Write(data, 0, stream.Length);
                                     ++socket.timeoutIdentity;
                                 }
                                 finally { Monitor.Exit(sendLock); }
                                 stream.UnsafeSetLength(0);
                             }
                             else if (webSocket.MessageCount == 0)
                             {
                                 Thread.Sleep(0);
                             }
                         }
                         else
                         {
                             if (stream.Length != 0)
                             {
                                 byte[] data = sender.GetData();
                                 Monitor.Enter(sendLock);
                                 try
                                 {
                                     webSocket.SslStream.Write(data, 0, stream.Length);
                                     ++socket.timeoutIdentity;
                                 }
                                 finally { Monitor.Exit(sendLock); }
                             }
                             return;
                         }
                     }
                     else
                     {
                         break;
                     }
                 }while (true);
             }
         }
     }
     catch { }
     finally { fastCSharp.memoryPool.StreamBuffers.PushNotNull(buffer); }
     webSocket.Client.shutdown();
 }
示例#13
0
 /// <summary>
 /// 对象序列化器
 /// </summary>
 /// <param name="isReferenceMember">是否检测相同的引用成员</param>
 /// <param name="stream">序列化流</param>
 /// <param name="memberFilter">成员选择</param>
 public reflectionDataSerializer(bool isReferenceMember, unmanagedStream stream, code.memberFilters memberFilter)
     : base(isReferenceMember, stream, memberFilter)
 {
 }
示例#14
0
 /// <summary>
 /// 序列化
 /// </summary>
 /// <param name="isReferenceMember">是否检测相同的引用成员</param>
 /// <param name="stream">序列化流</param>
 /// <param name="memberFilter">成员选择</param>
 protected serializer(bool isReferenceMember, unmanagedStream stream, code.memberFilters memberFilter)
     : base(isReferenceMember, stream, memberFilter)
 {
 }
示例#15
0
 /// <summary>
 /// 可空类型
 /// </summary>
 /// <typeparam name="valueType">数据类型</typeparam>
 /// <param name="serializer">反序列化器</param>
 /// <returns>可空类型数据</returns>
 private static void getNullType <valueType>(unmanagedStream stream, Nullable <valueType> value) where valueType : struct
 {
     Get <valueType>(stream, value.Value, code.memberFilters.InstanceField, default(memberMap <valueType>));
 }
示例#16
0
 /// <summary>
 /// 序列化接口
 /// </summary>
 /// <typeparam name="valueType">数据类型</typeparam>
 /// <param name="stream">内存数据流</param>
 /// <param name="value">序列化接口数据</param>
 private static void getISerializeType <valueType>(unmanagedStream stream, valueType value) where valueType : ISerialize
 {
     value.IndexSerialize(stream);
 }
示例#17
0
 /// <summary>
 /// 对象序列化
 /// </summary>
 /// <typeparam name="valueType">对象类型</typeparam>
 /// <param name="stream">内存数据流</param>
 /// <param name="value">数据对象</param>
 /// <param name="filter">成员选择,默认为公共字段成员</param>
 /// <param name="memberMap">成员位图</param>
 public static void Get <valueType>(unmanagedStream stream, valueType value
                                    , code.memberFilters filter = code.memberFilters.InstanceField, memberMap <valueType> memberMap = default(memberMap <valueType>))
 {
     dataSerialize <valueType> .Get(stream, value, filter, memberMap);
 }
示例#18
0
 /// <summary>
 /// 序列化
 /// </summary>
 /// <param name="stream"></param>
 internal override void FieldSerialize(unmanagedStream stream)
 {
     memberMap.FieldSerialize(stream, map, TypeInfo);
 }
 /// <summary>
 /// 获取解压数据
 /// </summary>
 /// <returns>解压数据</returns>
 public unsafe subArray<byte> Get(memoryPool memoryPool)
 {
     if (memoryPool == null)
     {
         pointer data = fastCSharp.unmanagedPool.StreamBuffers.Get();
         try
         {
             using (dataStream = new unmanagedStream(data.Byte, fastCSharp.unmanagedPool.StreamBuffers.Size))
             {
                 get();
                 return new subArray<byte>(dataStream.GetArray());
             }
         }
         finally { fastCSharp.unmanagedPool.StreamBuffers.Push(ref data); }
     }
     else
     {
         byte[] data = memoryPool.Get();
         try
         {
             fixed (byte* dataFixed = data)
             {
                 using (dataStream = new unmanagedStream(dataFixed, data.Length))
                 {
                     get();
                     if (dataStream.Data == dataFixed)
                     {
                         byte[] buffer = data;
                         data = null;
                         return subArray<byte>.Unsafe(buffer, 0, dataStream.Length);
                     }
                     return new subArray<byte>(dataStream.GetArray());
                 }
             }
         }
         finally { memoryPool.Push(ref data); }
     }
 }