发布1203
大石头 编写于 2019-12-03 22:57:54
X
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
using NewLife.Collections;
using NewLife.Reflection;

namespace NewLife.Serialization
{
    /// <summary>Json序列化</summary>
    public class Json : FormatterBase, IJson
    {
        #region 属性
        /// <summary>是否缩进</summary>
        public Boolean Indented { get; set; }

        /// <summary>处理器列表</summary>
        public IList<IJsonHandler> Handlers { get; private set; }

        //private StringBuilder _builder;
        #endregion

        #region 构造
        /// <summary>实例化</summary>
        public Json()
        {
            UseProperty = true;

            //_builder = new StringBuilder();

            // 遍历所有处理器实现
            var list = new List<IJsonHandler>
            {
                new JsonGeneral { Host = this },
                new JsonComposite { Host = this },
                new JsonArray { Host = this }
            };
            //list.Add(new JsonDictionary { Host = this });
            // 根据优先级排序
            list.Sort();

            Handlers = list;
        }
        #endregion

        #region 处理器
        /// <summary>添加处理器</summary>
        /// <param name="handler"></param>
        /// <returns></returns>
        public Json AddHandler(IJsonHandler handler)
        {
            if (handler != null)
            {
                handler.Host = this;
                Handlers.Add(handler);
                // 根据优先级排序
                (Handlers as List<IJsonHandler>).Sort();
            }

            return this;
        }

        /// <summary>添加处理器</summary>
        /// <typeparam name="THandler"></typeparam>
        /// <param name="priority"></param>
        /// <returns></returns>
        public Json AddHandler<THandler>(Int32 priority = 0) where THandler : IJsonHandler, new()
        {
            var handler = new THandler
            {
                Host = this
            };
            if (priority != 0) handler.Priority = priority;

            return AddHandler(handler);
        }

        /// <summary>获取处理器</summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public T GetHandler<T>() where T : class, IJsonHandler
        {
            foreach (var item in Handlers)
            {
                if (item is T) return item as T;
            }

            return default(T);
        }
        #endregion

        #region 写入
        /// <summary>写入一个对象</summary>
        /// <param name="value">目标对象</param>
        /// <param name="type">类型</param>
        /// <returns></returns>
        [DebuggerHidden]
        public virtual Boolean Write(Object value, Type type = null)
        {
            if (type == null)
            {
                if (value == null) return true;

                type = value.GetType();

                // 一般类型为空是顶级调用
                if (Hosts.Count == 0 && Log != null && Log.Enable) WriteLog("JsonWrite {0} {1}", type.Name, value);
            }

            //foreach (var item in Handlers)
            //{
            //    if (item.Write(value, type)) return true;
            //}

            var sb = Pool.StringBuilder.Get();
            Write(sb, value);

            Stream.Write(sb.Put(true).GetBytes());

            return false;
        }

        /// <summary>写入字符串</summary>
        /// <param name="value"></param>
        public virtual void Write(String value)
        {
            //_builder.Append(value);
        }

        /// <summary>写入</summary>
        /// <param name="sb"></param>
        /// <param name="value"></param>
        public virtual void Write(StringBuilder sb, Object value)
        {
            if (value == null) return;
            var type = value.GetType();

            foreach (var item in Handlers)
            {
                if (item.Write(value, type)) return;
            }
        }
        #endregion

        #region 读取
        /// <summary>读取指定类型对象</summary>
        /// <param name="type"></param>
        /// <returns></returns>
        [DebuggerHidden]
        public virtual Object Read(Type type)
        {
            var value = type.CreateInstance();
            if (!TryRead(type, ref value)) throw new Exception("读取失败!");

            return value;
        }

        /// <summary>读取指定类型对象</summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        [DebuggerHidden]
        public T Read<T>() => (T)(Object)Read(typeof(T));

        /// <summary>尝试读取指定类型对象</summary>
        /// <param name="type"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        [DebuggerHidden]
        public virtual Boolean TryRead(Type type, ref Object value)
        {
            if (Hosts.Count == 0 && Log != null && Log.Enable) WriteLog("JsonRead {0} {1}", type.Name, value);

            foreach (var item in Handlers)
            {
                if (item.TryRead(type, ref value)) return true;
            }
            return false;
        }

        /// <summary>读取</summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public virtual Boolean Read(String value) => true;

        /// <summary>读取字节</summary>
        /// <returns></returns>
        public virtual Byte ReadByte()
        {
            var b = Stream.ReadByte();
            if (b < 0) throw new Exception("数据流超出范围!");
            return (Byte)b;
        }
        #endregion

        #region 辅助函数

        #endregion
    }
}