/// <summary> /// 检查是否符合 PrimitiveTypeEnumeration 的值 /// </summary> /// <param name="value"></param> /// <returns></returns> static public void IsPrimitiveTypeEnum(PrimitiveTypeEnumeration value) { if (value < PrimitiveTypeEnumeration.Boolean || value > PrimitiveTypeEnumeration.String) { throw new RollBackException(); } }
protected internal static Object ReadPrimitiveValue(IParsingContext context, PrimitiveTypeEnumeration type) { switch (type) { case PrimitiveTypeEnumeration.Boolean: return context.ReadBoolean(); case PrimitiveTypeEnumeration.Byte: return context.ReadByte(); case PrimitiveTypeEnumeration.Char: return context.ReadChar(); case PrimitiveTypeEnumeration.DateTime: var data = context.ReadInt64(); var dt = DateTime.FromBinary(data); var dtUtc = dt.ToUniversalTime(); return new DateTime(dtUtc.Ticks, dt.Kind); case PrimitiveTypeEnumeration.Decimal: return Decimal.Parse(context.ReadString(), CultureInfo.InvariantCulture); case PrimitiveTypeEnumeration.Double: return context.ReadDouble(); case PrimitiveTypeEnumeration.Int16: return context.ReadInt16(); case PrimitiveTypeEnumeration.Int32: return context.ReadInt32(); case PrimitiveTypeEnumeration.Int64: return context.ReadInt64(); case PrimitiveTypeEnumeration.Null: return null; case PrimitiveTypeEnumeration.SByte: return context.ReadSByte(); case PrimitiveTypeEnumeration.Single: return context.ReadSingle(); case PrimitiveTypeEnumeration.String: return context.ReadString(); case PrimitiveTypeEnumeration.TimeSpan: return TimeSpan.FromTicks(context.ReadInt64()); case PrimitiveTypeEnumeration.UInt16: return context.ReadUInt16(); case PrimitiveTypeEnumeration.UInt32: return context.ReadUInt32(); case PrimitiveTypeEnumeration.UInt64: return context.ReadUInt64(); default: throw new NotSupportedException("Unsupported primitive type " + type); } }
internal MemberPrimitiveUnTyped(IParsingContext context, PrimitiveTypeEnumeration primitiveType) { Value = ClassRecordBase.ReadPrimitiveValue(context, primitiveType); }
static public object GetPrimitiveTypeValue(IAnalyze analyze, PrimitiveTypeEnumeration primitiveType) { object value = null; switch (primitiveType) { case PrimitiveTypeEnumeration.Boolean: value = analyze.Reader.ReadBoolean(); break; case PrimitiveTypeEnumeration.Byte: value = analyze.Reader.ReadByte(); break; case PrimitiveTypeEnumeration.Char: value = analyze.Reader.ReadChar(); break; case PrimitiveTypeEnumeration.Decimal: value = analyze.Reader.ReadDecimal(); break; case PrimitiveTypeEnumeration.Double: value = analyze.Reader.ReadDouble(); break; case PrimitiveTypeEnumeration.Int16: value = analyze.Reader.ReadInt16(); break; case PrimitiveTypeEnumeration.Int32: value = analyze.Reader.ReadInt32(); break; case PrimitiveTypeEnumeration.Int64: value = analyze.Reader.ReadInt64(); break; case PrimitiveTypeEnumeration.SByte: value = analyze.Reader.ReadSByte(); break; case PrimitiveTypeEnumeration.Single: value = analyze.Reader.ReadSingle(); break; case PrimitiveTypeEnumeration.TimeSpan: value = new TimeSpan(analyze.Reader.ReadInt64()); break; case PrimitiveTypeEnumeration.DateTime: value = DateTime.FromBinary(analyze.Reader.ReadInt64()); break; case PrimitiveTypeEnumeration.UInt16: value = analyze.Reader.ReadUInt16(); break; case PrimitiveTypeEnumeration.UInt32: value = analyze.Reader.ReadUInt32(); break; case PrimitiveTypeEnumeration.UInt64: value = analyze.Reader.ReadUInt64(); break; case PrimitiveTypeEnumeration.String: value = analyze.Reader.ReadString(); break; } return(value); }
private static Object ReadPrimitiveValue(DeserializationState state, PrimitiveTypeEnumeration primitive) { Object value; switch (primitive) { case PrimitiveTypeEnumeration.Boolean: value = state.array.ReadByteFromBytes(ref state.idx) != 0; break; case PrimitiveTypeEnumeration.Byte: value = state.array.ReadByteFromBytes(ref state.idx); break; case PrimitiveTypeEnumeration.Char: var startIdx = state.idx; var charArray = new Char[1]; Int32 charsRead; do { ++state.idx; charsRead = UTF8.GetChars(state.array, startIdx, state.idx - startIdx, charArray, 0); } while (charsRead == 0); value = charArray[0]; break; case PrimitiveTypeEnumeration.Decimal: var str = state.array.Read7BitLengthPrefixedString(ref state.idx); Decimal d; Decimal.TryParse(str, out d); // I'm not quite sure why but apparently actual binary value of decimal follows? var int1 = state.array.ReadInt32LEFromBytes(ref state.idx); var int2 = state.array.ReadInt32LEFromBytes(ref state.idx); var int3 = state.array.ReadInt32LEFromBytes(ref state.idx); var int4 = state.array.ReadInt32LEFromBytes(ref state.idx); value = new Decimal(new[] { int1, int2, int3, int4 }); break; case PrimitiveTypeEnumeration.Double: value = state.array.ReadDoubleLEFromBytes(ref state.idx); break; case PrimitiveTypeEnumeration.Int16: value = state.array.ReadInt16LEFromBytes(ref state.idx); break; case PrimitiveTypeEnumeration.Int32: value = state.array.ReadInt32LEFromBytes(ref state.idx); break; case PrimitiveTypeEnumeration.Int64: value = state.array.ReadInt64LEFromBytes(ref state.idx); break; case PrimitiveTypeEnumeration.SByte: value = state.array.ReadSByteFromBytes(ref state.idx); break; case PrimitiveTypeEnumeration.Single: value = state.array.ReadSingleLEFromBytes(ref state.idx); break; case PrimitiveTypeEnumeration.TimeSpan: value = TimeSpan.FromTicks(state.array.ReadInt64LEFromBytes(ref state.idx)); break; case PrimitiveTypeEnumeration.DateTime: value = DateTime.FromBinary(state.array.ReadInt64LEFromBytes(ref state.idx)); break; case PrimitiveTypeEnumeration.UInt16: value = state.array.ReadUInt16LEFromBytes(ref state.idx); break; case PrimitiveTypeEnumeration.UInt32: value = state.array.ReadUInt32LEFromBytes(ref state.idx); break; case PrimitiveTypeEnumeration.UInt64: value = state.array.ReadUInt64LEFromBytes(ref state.idx); break; case PrimitiveTypeEnumeration.Null: value = null; break; case PrimitiveTypeEnumeration.String: value = state.array.Read7BitLengthPrefixedString(ref state.idx); break; default: throw new InvalidOperationException("Unknown primitive type: " + primitive + "."); } return(value); }
private static void WritePrimitive(SerializationState state, Object primitive, PrimitiveTypeEnumeration pType) { String s; Int32 len; switch (pType) { case PrimitiveTypeEnumeration.Boolean: state.EnsureCapacity(1); state.array.WriteByteToBytes(ref state.idx, ((Boolean)primitive) == true ? (Byte)1 : (Byte)0); break; case PrimitiveTypeEnumeration.Byte: state.EnsureCapacity(1); state.array.WriteByteToBytes(ref state.idx, (Byte)primitive); break; case PrimitiveTypeEnumeration.Char: state.EnsureCapacity(4); state.idx = UTF8.GetBytes(new[] { (Char)primitive }, 0, 1, state.array, 0); break; case PrimitiveTypeEnumeration.Decimal: var d = (Decimal)primitive; s = d.ToString(); len = UTF8.GetByteCount(s); var ints = Decimal.GetBits(d); state.EnsureCapacity(5 + len + 16); state.array .WriteInt32Encoded7Bit(ref state.idx, len) .WriteStringToBytes(ref state.idx, UTF8, s) .WriteInt32LEToBytes(ref state.idx, ints[0]) .WriteInt32LEToBytes(ref state.idx, ints[1]) .WriteInt32LEToBytes(ref state.idx, ints[2]) .WriteInt32LEToBytes(ref state.idx, ints[3]); break; case PrimitiveTypeEnumeration.Double: state.EnsureCapacity(8); state.array.WriteDoubleLEToBytes(ref state.idx, (Double)primitive); break; case PrimitiveTypeEnumeration.Int16: state.EnsureCapacity(2); state.array.WriteInt16LEToBytes(ref state.idx, (Int16)primitive); break; case PrimitiveTypeEnumeration.Int32: state.EnsureCapacity(4); state.array.WriteInt32LEToBytes(ref state.idx, (Int32)primitive); break; case PrimitiveTypeEnumeration.Int64: state.EnsureCapacity(8); state.array.WriteInt64LEToBytes(ref state.idx, (Int64)primitive); break; case PrimitiveTypeEnumeration.SByte: state.EnsureCapacity(1); state.array.WriteSByteToBytes(ref state.idx, (SByte)primitive); break; case PrimitiveTypeEnumeration.Single: state.EnsureCapacity(4); state.array.WriteSingleLEToBytes(ref state.idx, (Single)primitive); break; case PrimitiveTypeEnumeration.TimeSpan: state.EnsureCapacity(8); state.array.WriteInt64LEToBytes(ref state.idx, ((TimeSpan)primitive).Ticks); break; case PrimitiveTypeEnumeration.DateTime: state.EnsureCapacity(8); state.array.WriteInt64LEToBytes(ref state.idx, ((DateTime)primitive).Ticks); break; case PrimitiveTypeEnumeration.UInt16: state.EnsureCapacity(2); state.array.WriteUInt16LEToBytes(ref state.idx, (UInt16)primitive); break; case PrimitiveTypeEnumeration.UInt32: state.EnsureCapacity(4); state.array.WriteUInt32LEToBytes(ref state.idx, (UInt32)primitive); break; case PrimitiveTypeEnumeration.UInt64: state.EnsureCapacity(8); state.array.WriteUInt64LEToBytes(ref state.idx, (UInt64)primitive); break; case PrimitiveTypeEnumeration.Null: state.EnsureCapacity(0); break; case PrimitiveTypeEnumeration.String: s = (String)primitive; len = UTF8.GetByteCount(s); state.EnsureCapacity(5 + len); state.array .WriteInt32Encoded7Bit(ref state.idx, len) .WriteStringToBytes(ref state.idx, UTF8, s); break; default: state.EnsureCapacity(0); break; } state.WriteArrayToStream(); }
private static BinaryTypeEnumeration GetTypeInfo(Object obj, out PrimitiveTypeEnumeration pType) { pType = (PrimitiveTypeEnumeration)255; if (obj == null) { pType = PrimitiveTypeEnumeration.Null; return(BinaryTypeEnumeration.Primitive); } else { switch (Type.GetTypeCode(obj.GetType())) { case TypeCode.Object: if (obj is AbstractRecord) { switch (((AbstractRecord)obj).Kind) { case RecordKind.String: return(BinaryTypeEnumeration.String); case RecordKind.Class: return(((ClassRecord)obj).AssemblyName == null ? BinaryTypeEnumeration.SystemClass : BinaryTypeEnumeration.Class); case RecordKind.Array: var array = (ArrayRecord)obj; if (array.Rank == 1) { var firstNonNull = array.ValuesAsVector.FirstOrDefault(o => o != null); switch (GetTypeInfo(firstNonNull, out pType)) { case BinaryTypeEnumeration.String: return(BinaryTypeEnumeration.StringArray); case BinaryTypeEnumeration.Primitive: return(BinaryTypeEnumeration.PrimitiveArray); default: return(BinaryTypeEnumeration.ObjectArray); } } else { return(BinaryTypeEnumeration.ObjectArray); } case RecordKind.PrimitiveWrapper: return(BinaryTypeEnumeration.SystemClass); default: throw new NotSupportedException("Unknown record " + obj + "."); } } else { throw new InvalidOperationException("Only primitives and AbstractRecords allowed as values. Encountered " + obj + " as value."); } case TypeCode.String: return(BinaryTypeEnumeration.String); default: pType = GetPrimitiveType(obj); return(BinaryTypeEnumeration.Primitive); } } }
protected internal static Type ToRealType(PrimitiveTypeEnumeration type) { switch (type) { case PrimitiveTypeEnumeration.Boolean: return typeof (Boolean); case PrimitiveTypeEnumeration.Byte: return typeof(Byte); case PrimitiveTypeEnumeration.Char: return typeof(Char); case PrimitiveTypeEnumeration.DateTime: return typeof (DateTime); case PrimitiveTypeEnumeration.Decimal: return typeof (Decimal); case PrimitiveTypeEnumeration.Double: return typeof (Double); case PrimitiveTypeEnumeration.Int16: return typeof(Int16); case PrimitiveTypeEnumeration.Int32: return typeof(Int32); case PrimitiveTypeEnumeration.Int64: return typeof(Int64); case PrimitiveTypeEnumeration.SByte: return typeof(SByte); case PrimitiveTypeEnumeration.Single: return typeof(Single); case PrimitiveTypeEnumeration.String: return typeof(String); case PrimitiveTypeEnumeration.TimeSpan: return typeof(TimeSpan); case PrimitiveTypeEnumeration.UInt16: return typeof(UInt16); case PrimitiveTypeEnumeration.UInt32: return typeof(UInt32); case PrimitiveTypeEnumeration.UInt64: return typeof(UInt64); default: throw new NotSupportedException("Unsupported primitive type " + type); } }