trim HttpHeaders
石头 编写于 2024-06-22 08:55:23
X
using System;
using System.Collections;
using System.Xml.Serialization;
using NewLife.Serialization;

namespace NewLife.Messaging
{
    /// <summary>指定类型的对象消息</summary>
    /// <remarks>
    /// 一般用于打包单个对象,理论上,这是一个万能消息。
    /// 需要注意的是:本消息的设计,允许通讯双方使用不同的类,只要这两个类继承相同的接口或者抽象类。
    /// 不写长度,所以<see cref="Message"/>为空时后面不能有其它包
    /// </remarks>
    public class EntityMessage : Message, IAccessor
    {
        /// <summary>消息类型</summary>
        [XmlIgnore]
        public override MessageKind Kind { get { return MessageKind.Entity; } }

        private Type _Type;
        /// <summary>实体类型。可以是接口或抽象类型(要求对象容器能识别)</summary>
        public Type Type
        {
            get
            {
                if (_Type == null && _Value != null) _Type = _Value.GetType();
                return _Type;
            }
            set { _Type = value; }
        }

        private Object _Value;
        /// <summary>对象值</summary>
        public Object Value { get { return _Value; } set { _Value = value; if (value != null) Type = value.GetType(); } }

        #region IAccessor 成员
        Boolean IAccessor.Read(IReader reader)
        {
            //reader.OnMemberReading += new EventHandler<ReadMemberEventArgs>(reader_OnMemberReading);
            //return false;

            reader.Depth++;

            Object v = null;
            if (!reader.ReadObject(typeof(Type), ref v, null)) return false;
            Type = v as Type;
            if (Type != null)
            {
                v = null;
                if (!reader.ReadObject(Type, ref v, null)) return false;
                Value = v;
            }
            reader.Depth--;
            return true;
        }

        //void reader_OnMemberReading(object sender, ReadMemberEventArgs e)
        //{
        //    var reader = sender as IReader;
        //    if (reader.CurrentObject == this && e.Member.Name == "_Value")
        //    {
        //        e.Type = Type;
        //        reader.OnMemberReading -= new EventHandler<ReadMemberEventArgs>(reader_OnMemberReading);
        //    }
        //}

        Boolean IAccessor.ReadComplete(IReader reader, Boolean success) { return success; }

        Boolean IAccessor.Write(IWriter writer)
        {
            //writer.OnMemberWriting += new EventHandler<WriteMemberEventArgs>(writer_OnMemberWriting);
            //return false;
            writer.Depth++;
            writer.WriteObject(Type);
            if (Type != null) writer.WriteObject(Value);
            writer.Depth--;
            return true;
        }

        //void writer_OnMemberWriting(object sender, WriteMemberEventArgs e)
        //{
        //    var writer = sender as IWriter;
        //    if (writer.CurrentObject == this && e.Name == "_Value")
        //    {
        //        e.Type = Type;
        //        writer.OnMemberWriting -= new EventHandler<WriteMemberEventArgs>(writer_OnMemberWriting);
        //    }
        //}

        Boolean IAccessor.WriteComplete(IWriter writer, Boolean success) { return success; }
        #endregion

        #region 辅助
        /// <summary>已重载。</summary>
        /// <returns></returns>
        public override string ToString()
        {
            var type = Type;
            if (type != null && typeof(IList).IsAssignableFrom(type))
                return String.Format("{0} {1}[{2}]", base.ToString(), type, Value == null ? 0 : (Value as IList).Count);
            else if (type == typeof(String))
            {
                var str = "" + Value;
                //return String.Format("{0} {1}", base.ToString(), str.Length < 50 ? str : str.Substring(0, 47) + "...");
                return String.Format("{0} {1}", base.ToString(), str.Cut(50, "..."));
            }
            else
                return String.Format("{0} {1}", base.ToString(), Value);
        }
        #endregion
    }
}