/// <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; } }
/// <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); } }
/// <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(' '); } }
/// <summary> /// URL 哈希字符 /// </summary> /// <param name="stream"></param> internal void WriteUrlHash(UnmanagedStream stream) { if ((Type & EncodingType.CompatibleAscii) != 0) stream.Write(*urlHashAscii.Short); }