必须填写至少10个字的日志
nnhy 编写于 2012-07-27 18:48:21
X
using System;
using System.Net;

namespace NewLife.Serialization
{
    /// <summary>文本读取器基类</summary>
    /// <typeparam name="TSettings">设置类</typeparam>
    public abstract class TextReaderBase<TSettings> : ReaderBase<TSettings> where TSettings : TextReaderWriterSetting, new()
    {
        #region 属性
        /// <summary>是否使用大小,如果使用,将在写入数组、集合和字符串前预先写入大小。字符串类型读写器一般带有边界,不需要使用大小</summary>
        protected override Boolean UseSize { get { return false; } }
        #endregion

        #region 基础元数据
        #region 字节
        /// <summary>从当前流中读取下一个字节,并使流的当前位置提升 1 个字节。</summary>
        /// <returns></returns>
        public override byte ReadByte() { return ReadBytes(1)[0]; }

        /// <summary>从当前流中将 count 个字节读入字节数组,并使当前位置提升 count 个字节。</summary>
        /// <param name="count">要读取的字节数。</param>
        /// <returns></returns>
        public override byte[] ReadBytes(int count)
        {
            String str = ReadString();
            if (str == null) return null;
            if (str.Length == 0) return new Byte[] { };

            if (Settings.UseBase64)
                return Convert.FromBase64String(str);
            else
                return FromHex(str);
        }

        /// <summary>解密</summary>
        /// <param name="data"></param>
        /// <returns></returns>
        static Byte[] FromHex(String data)
        {
            if (String.IsNullOrEmpty(data)) return null;

            Byte[] bts = new Byte[data.Length / 2];
            for (int i = 0; i < data.Length / 2; i++)
            {
                bts[i] = (Byte)Convert.ToInt32(data.Substring(2 * i, 2), 16);
            }
            return bts;
        }
        #endregion

        #region 有符号整数
        /// <summary>从当前流中读取 2 字节有符号整数,并使流的当前位置提升 2 个字节。</summary>
        /// <returns></returns>
        public override short ReadInt16() { return (Int16)ReadInt32(); }

        /// <summary>从当前流中读取 4 字节有符号整数,并使流的当前位置提升 4 个字节。</summary>
        /// <returns></returns>
        public override int ReadInt32() { return (Int32)ReadInt64(); }

        /// <summary>从当前流中读取 8 字节有符号整数,并使流的当前位置向前移动 8 个字节。</summary>
        /// <returns></returns>
        public override long ReadInt64() { return Int64.Parse(ReadString()); }
        #endregion

        #region 浮点数
        /// <summary>从当前流中读取 4 字节浮点值,并使流的当前位置提升 4 个字节。</summary>
        /// <returns></returns>
        public override float ReadSingle() { return (Single)ReadDouble(); }

        /// <summary>从当前流中读取 8 字节浮点值,并使流的当前位置提升 8 个字节。</summary>
        /// <returns></returns>
        public override double ReadDouble() { return Double.Parse(ReadString()); }
        #endregion

        #region 字符串
        /// <summary>从当前流中读取 count 个字符,以字符数组的形式返回数据,并根据所使用的 Encoding 和从流中读取的特定字符,提升当前位置。</summary>
        /// <param name="count">要读取的字符数。</param>
        /// <returns></returns>
        public override char[] ReadChars(int count)
        {
            String str = ReadString();
            if (str == null) return null;

            return str.ToCharArray();
        }

        /// <summary>从当前流中读取一个字符串。字符串有长度前缀,一次 7 位地被编码为整数。</summary>
        /// <returns></returns>
        public override string ReadString() { throw new NotImplementedException(); }
        #endregion

        #region 其它
        /// <summary>从当前流中读取 Boolean 值,并使该流的当前位置提升 1 个字节。</summary>
        /// <returns></returns>
        public override bool ReadBoolean() { return Boolean.Parse(ReadString()); }

        /// <summary>从当前流中读取十进制数值,并将该流的当前位置提升十六个字节。</summary>
        /// <returns></returns>
        public override decimal ReadDecimal() { return Decimal.Parse(ReadString()); }

        /// <summary>读取一个时间日期</summary>
        /// <returns></returns>
        public override DateTime ReadDateTime() { return DateTime.Parse(ReadString()); }
        #endregion
        #endregion

        #region 扩展类型
        /// <summary>读取Guid</summary>
        /// <returns></returns>
        protected override Guid OnReadGuid() { return new Guid(ReadString()); }

        /// <summary>读取IPAddress</summary>
        /// <returns></returns>
        protected override IPAddress OnReadIPAddress()
        {
            String str = ReadString();
            if (String.IsNullOrEmpty(str)) return null;

            return IPAddress.Parse(str);
        }

        /// <summary>读取IPEndPoint</summary>
        /// <returns></returns>
        protected override IPEndPoint OnReadIPEndPoint()
        {
            String str = ReadString();
            if (String.IsNullOrEmpty(str)) return null;

            Int32 index = str.IndexOf(":");

            IPAddress address = IPAddress.Parse(str.Substring(0, index));
            Int32 port = Int32.Parse(str.Substring(index + 1));
            return new IPEndPoint(address, port);
        }
        #endregion

        #region 读取值
        /// <summary>尝试读取值类型数据,返回是否读取成功</summary>
        /// <param name="type">要读取的对象类型</param>
        /// <param name="value">要读取的对象</param>
        /// <returns></returns>
        public override bool ReadValue(Type type, ref object value)
        {
            if (type != null && type.IsEnum && Settings.UseEnumName)
            {
                String str = ReadString();
                value = Enum.Parse(type, str, true);
                return true;
            }
            return base.ReadValue(type, ref value);
        }
        #endregion
    }
}