Exemple #1
0
        /// <summary>
        /// 获取ElementDataType对应的C#中的数据类型
        /// </summary>
        /// <param name="element">节点元素</param>
        /// <returns>ElementDataType对应的C#中的数据类型</returns>
        public static Type GetType(ElementDataType dataType)
        {
            switch (dataType)
            {
            case ElementDataType.String:
            case ElementDataType.Text:
                return(typeof(string));

            case ElementDataType.Boolean:
            case ElementDataType.Integer:
                return(typeof(int));

            case ElementDataType.Decimal:
                return(typeof(decimal));

            case ElementDataType.Date:
            case ElementDataType.DateTime:
                return(typeof(DateTime));

            case ElementDataType.Binary:
                return(typeof(byte[]));

            default:
                throw new NotSupportedException(dataType.ToString());
            }
        }
 public ElementAttribute(ElementDataType dataType, int length, int precision = 0, object defaultValue = null, string displayName = "")
 {
     this.DataType     = dataType;
     this.Length       = length;
     this.Precision    = precision;
     this.DefaultValue = defaultValue;
     this.DisplayName  = displayName;
 }
        private object[] ReadArrayOfNullableElements(IDeserializer Reader, ulong NrElements)
        {
            List <object> Elements = new List <object>();
            uint          ElementDataType;

            while (NrElements-- > 0)
            {
                ElementDataType = Reader.ReadBits(6);

                switch (ElementDataType)
                {
                case ObjectSerializer.TYPE_BOOLEAN:
                    Elements.Add(Reader.ReadBoolean());
                    break;

                case ObjectSerializer.TYPE_BYTE:
                    Elements.Add(Reader.ReadByte());
                    break;

                case ObjectSerializer.TYPE_INT16:
                    Elements.Add(Reader.ReadInt16());
                    break;

                case ObjectSerializer.TYPE_INT32:
                    Elements.Add(Reader.ReadInt32());
                    break;

                case ObjectSerializer.TYPE_INT64:
                    Elements.Add(Reader.ReadInt64());
                    break;

                case ObjectSerializer.TYPE_SBYTE:
                    Elements.Add(Reader.ReadSByte());
                    break;

                case ObjectSerializer.TYPE_UINT16:
                    Elements.Add(Reader.ReadUInt16());
                    break;

                case ObjectSerializer.TYPE_UINT32:
                    Elements.Add(Reader.ReadUInt32());
                    break;

                case ObjectSerializer.TYPE_UINT64:
                    Elements.Add(Reader.ReadUInt64());
                    break;

                case ObjectSerializer.TYPE_DECIMAL:
                    Elements.Add(Reader.ReadDecimal());
                    break;

                case ObjectSerializer.TYPE_DOUBLE:
                    Elements.Add(Reader.ReadDouble());
                    break;

                case ObjectSerializer.TYPE_SINGLE:
                    Elements.Add(Reader.ReadSingle());
                    break;

                case ObjectSerializer.TYPE_DATETIME:
                    Elements.Add(Reader.ReadDateTime());
                    break;

                case ObjectSerializer.TYPE_DATETIMEOFFSET:
                    Elements.Add(Reader.ReadDateTimeOffset());
                    break;

                case ObjectSerializer.TYPE_TIMESPAN:
                    Elements.Add(Reader.ReadTimeSpan());
                    break;

                case ObjectSerializer.TYPE_CHAR:
                    Elements.Add(Reader.ReadChar());
                    break;

                case ObjectSerializer.TYPE_STRING:
                case ObjectSerializer.TYPE_ENUM:
                    Elements.Add(Reader.ReadString());
                    break;

                case ObjectSerializer.TYPE_CI_STRING:
                    Elements.Add(new CaseInsensitiveString(Reader.ReadString()));
                    break;

                case ObjectSerializer.TYPE_BYTEARRAY:
                    Elements.Add(Reader.ReadByteArray());
                    break;

                case ObjectSerializer.TYPE_GUID:
                    Elements.Add(Reader.ReadGuid());
                    break;

                case ObjectSerializer.TYPE_ARRAY:
                    Elements.Add(this.ReadGenericArray(Reader));
                    break;

                case ObjectSerializer.TYPE_OBJECT:
                    Elements.Add(this.Deserialize(Reader, ElementDataType, true));
                    break;

                case ObjectSerializer.TYPE_NULL:
                    Elements.Add(null);
                    break;

                default:
                    throw new Exception("Unrecognized data type: " + ElementDataType.ToString());
                }
            }

            return(Elements.ToArray());
        }
            /// <summary>
            /// Initializing from stream by encoded <see cref="DataTypes"/>.
            /// </summary>
            internal DataTypeDescriptor(DataTypeDescriptor parentDescriptor, DataTypes dataType, BinaryReader reader)
            {
                ParentDescriptor = parentDescriptor;
                this.dataType    = dataType;

                if (ElementDataType == DataTypes.GenericTypeDefinition)
                {
                    return;
                }

                // recursion 1: Element type in collections, pointers and ByRef types
                // (In case of simple collections ElementDescriptor will be created on decode)
                if (CollectionDataType != DataTypes.Null && ElementDataType == DataTypes.Null || ElementDataType.In(DataTypes.Pointer, DataTypes.ByRef))
                {
                    ElementDescriptor = new DataTypeDescriptor(this, ReadDataType(reader), reader);
                }

                // recursion 2: TValue in dictionaries
                if (IsDictionary)
                {
                    ValueDescriptor = new DataTypeDescriptor(this, ReadDataType(reader), reader);
                }
            }