示例#1
0
 /// <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);
 }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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();
        }
示例#7
0
        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);
            }
        }