예제 #1
0
        /// <summary>读取成员之前获取要读取的成员,默认是index处的成员,实现者可以重载,改变当前要读取的成员,如果当前成员不在数组里面,则实现者自己跳到下一个可读成员。</summary>
        /// <param name="type">要读取的对象类型</param>
        /// <param name="value">要读取的对象</param>
        /// <param name="members">可匹配成员数组</param>
        /// <param name="index">索引</param>
        /// <returns></returns>
        protected override IObjectMemberInfo GetMemberBeforeRead(Type type, object value, IObjectMemberInfo[] members, int index)
        {
            String name = String.Empty;

            while (Reader.NodeType != XmlNodeType.None && Reader.IsStartElement())
            {
                name = Reader.Name;

                IObjectMemberInfo member = GetMemberByName(members, name);
                if (member != null)
                {
                    return(member);
                }

                if (SkipEmpty())
                {
                    continue;
                }

                Reader.ReadStartElement();

                if (!SkipEmpty())
                {
                    Reader.Read();
                }

                if (Reader.NodeType == XmlNodeType.EndElement)
                {
                    Reader.ReadEndElement();
                }
            }

            return(null);
        }
예제 #2
0
        /// <summary>读取成员之前获取要读取的成员,默认是index处的成员,实现者可以重载,改变当前要读取的成员,如果当前成员不在数组里面,则实现者自己跳到下一个可读成员。</summary>
        /// <param name="type">要读取的对象类型</param>
        /// <param name="value">要读取的对象</param>
        /// <param name="members">可匹配成员数组</param>
        /// <param name="index">索引</param>
        /// <returns></returns>
        protected override IObjectMemberInfo GetMemberBeforeRead(Type type, object value, IObjectMemberInfo[] members, int index)
        {
            if (!Settings.IgnoreName)
            {
                while (true)
                {
                    String            name   = ReadString();
                    IObjectMemberInfo member = GetMemberByName(members, name);
                    if (member != null)
                    {
                        return(member);
                    }

                    // 无法找到可匹配的成员,尝试跳过该成员
                    if (Settings.IgnoreType)
                    {
                        throw new XException("需要跳过成员" + name + ",但是无法确定其类型!");
                    }

                    Object obj = null;
                    ReadObject(null, ref obj, null);
                }
            }

            return(base.GetMemberBeforeRead(type, value, members, index));
        }
예제 #3
0
 /// <summary>实例化</summary>
 /// <param name="value">对象</param>
 /// <param name="type">对象类型</param>
 /// <param name="member">成员</param>
 /// <param name="index">成员序号</param>
 /// <param name="callback"></param>
 public WriteMemberEventArgs(Object value, Type type, IObjectMemberInfo member, Int32 index, WriteObjectCallback callback)
     : base(index, callback)
 {
     Value = value;
     Member = member;
     Type = type;
 }
예제 #4
0
        /// <summary>写入对象成员</summary>
        /// <param name="value">要写入的对象</param>
        /// <param name="type">要写入的对象类型</param>
        /// <param name="member">成员</param>
        /// <param name="index">成员索引</param>
        /// <param name="callback">处理成员的方法</param>
        /// <returns>是否写入成功</returns>
        protected override bool OnWriteMember(object value, Type type, IObjectMemberInfo member, Int32 index, WriteObjectCallback callback)
        {
            // 检查成员的值,如果是默认值,则不输出
            if (value != null && Settings.IgnoreDefault && IsDefault(value, member))
            {
                return(true);
            }

            // 特殊处理特性,只有普通值类型才能输出为特性
            Boolean isAtt = Settings.MemberAsAttribute && IsAttributeType(member.Type);

            if (isAtt)
            {
                Writer.WriteStartAttribute(member.Name);
            }
            else
            {
                Writer.WriteStartElement(member.Name);
            }

            AutoFlush();

            Boolean rs = base.OnWriteMember(value, type, member, index, callback);

            if (!isAtt)
            {
                Writer.WriteEndElement();
            }

            AutoFlush();

            return(rs);
        }
예제 #5
0
 /// <summary>实例化</summary>
 /// <param name="value">对象</param>
 /// <param name="type">对象类型</param>
 /// <param name="member">成员</param>
 /// <param name="index">成员序号</param>
 /// <param name="callback"></param>
 public WriteMemberEventArgs(Object value, Type type, IObjectMemberInfo member, Int32 index, WriteObjectCallback callback)
     : base(index, callback)
 {
     Value  = value;
     Member = member;
     Type   = type;
 }
예제 #6
0
파일: JsonWriter.cs 프로젝트: xlfj5211/esb
        /// <summary>写入成员</summary>
        /// <param name="value">要写入的对象</param>
        /// <param name="memberType">要写入的成员类型</param>
        /// <param name="member">要写入的成员信息,可以通过[value]取得成员值</param>
        /// <param name="index">成员索引</param>
        /// <param name="callback">处理成员的方法</param>
        /// <returns>是否写入成功</returns>
        protected override bool OnWriteMember(object value, Type memberType, IObjectMemberInfo member, Int32 index, WriteObjectCallback callback)
        {
            if (index > 0 || writeValueType != null)
            {
                writeValueType = null;
                Writer.Write(",");
            }
            WriteMemberCount++;

            WriteLine();

            Writer.Write("\"" + JavascriptStringEncode(member.Name) + "\":");

            object obj = member[value];

            if (obj != null && !IsExactType(memberType))
            {
                memberType     = obj.GetType(); //避免base.OnWriteMember中写入obj.GetType()
                writeValueType = obj;
            }
            bool ret = base.OnWriteMember(value, memberType, member, index, callback);

            writeValueType = null;
            return(ret);
        }
예제 #7
0
 /// <summary>实例化</summary>
 /// <param name="value">对象</param>
 /// <param name="type">对象类型</param>
 /// <param name="member">成员</param>
 /// <param name="index">成员序号</param>
 /// <param name="callback"></param>
 public ReadMemberEventArgs(Object value, Type type, IObjectMemberInfo member, Int32 index, ReadObjectCallback callback)
     : base(callback)
 {
     Value  = value;
     Type   = type;
     Member = member;
     Index  = index;
 }
예제 #8
0
        /// <summary>写入对象成员</summary>
        /// <param name="value">要写入的对象</param>
        /// <param name="type">要写入的对象类型</param>
        /// <param name="member">成员</param>
        /// <param name="index">成员索引</param>
        /// <param name="callback">处理成员的方法</param>
        /// <returns>是否写入成功</returns>
        protected override bool OnWriteMember(object value, Type type, IObjectMemberInfo member, int index, WriteObjectCallback callback)
        {
            if (!Settings.IgnoreName)
            {
                Write(member.Name);
            }

            return(base.OnWriteMember(value, type, member, index, callback));
        }
예제 #9
0
        /// <summary>读取对象成员</summary>
        /// <param name="type">要读取的对象类型</param>
        /// <param name="value">要读取的对象</param>
        /// <param name="member">成员</param>
        /// <param name="index">成员索引</param>
        /// <param name="callback">处理成员的方法</param>
        /// <returns>是否读取成功</returns>
        protected override bool OnReadMember(Type type, ref object value, IObjectMemberInfo member, Int32 index, ReadObjectCallback callback)
        {
            Boolean isAtt = Settings.MemberAsAttribute && XmlWriterX.IsAttributeType(member.Type);

            if (isAtt)
            {
                Reader.MoveToAttribute(member.Name);
            }

            return(base.OnReadMember(type, ref value, member, index, callback));
        }
예제 #10
0
        /// <summary>判断一个对象的某个成员是否默认值</summary>
        /// <param name="value"></param>
        /// <param name="member"></param>
        /// <returns></returns>
        internal static Boolean IsDefault(Object value, IObjectMemberInfo member)
        {
            if (value == null)
            {
                return(false);
            }

            Object def = ObjectInfo.GetDefaultObject(value.GetType());

            return(Object.Equals(member[value], member[def]));
        }
예제 #11
0
 /// <summary>初始化</summary>
 /// <param name="member"></param>
 /// <param name="innerException"></param>
 public XSerializationException(IObjectMemberInfo member, Exception innerException)
     : base((innerException != null ? innerException.Message : null) + (member != null ? "[Member:" + member.Name + "]" : null), innerException)
 {
     _Member = member;
 }
예제 #12
0
 /// <summary>初始化</summary>
 /// <param name="member"></param>
 /// <param name="message"></param>
 /// <param name="innerException"></param>
 public XSerializationException(IObjectMemberInfo member, String message, Exception innerException)
     : base(message + (member != null ? "[Member:" + member.Name + "]" : null), innerException)
 {
     _Member = member;
 }
예제 #13
0
 /// <summary>初始化</summary>
 /// <param name="member"></param>
 /// <param name="message"></param>
 public XSerializationException(IObjectMemberInfo member, String message) : base(message)
 {
     _Member = member;
 }
예제 #14
0
 /// <summary>初始化</summary>
 /// <param name="member"></param>
 public XSerializationException(IObjectMemberInfo member)
 {
     _Member = member;
 }
예제 #15
0
파일: WriterBase.cs 프로젝트: xlfj5211/esb
        /// <summary>写入对象成员</summary>
        /// <param name="value">要写入的对象</param>
        /// <param name="type">要写入的成员类型</param>
        /// <param name="member">成员</param>
        /// <param name="index">成员索引</param>
        /// <param name="callback">处理成员的方法</param>
        /// <returns>是否写入成功</returns>
        public Boolean WriteMember(Object value, Type type, IObjectMemberInfo member, Int32 index, WriteObjectCallback callback)
        {
            if (callback == null)
            {
                callback = WriteMember;
            }

            IObjectMemberInfo old = CurrentMember;

            CurrentMember = member;

#if !DEBUG
            try
#endif
            {
                // 写入成员前
                WriteMemberEventArgs e = null;
                if (OnMemberWriting != null)
                {
                    e = new WriteMemberEventArgs(value, type, member, index, callback);

                    OnMemberWriting(this, e);

                    // 事件处理器可能已经成功写入对象
                    if (e.Success)
                    {
                        CurrentMember = old;
                        return(true);
                    }

                    // 事件里面有可能改变了参数
                    value    = e.Value;
                    type     = e.Type;
                    member   = e.Member;
                    index    = e.Index;
                    callback = e.Callback;
                }

                Boolean rs = OnWriteMember(value, type, member, index, callback);

                // 写入成员后
                if (OnMemberWrited != null)
                {
                    e         = new WriteMemberEventArgs(value, type, member, index, callback);
                    e.Success = rs;

                    OnMemberWrited(this, e);

                    // 事件处理器可以影响结果
                    rs = e.Success;
                }

                CurrentMember = old;

                return(rs);
            }
#if !DEBUG
            catch (Exception ex)
            {
                throw new XSerializationException(member, ex);
            }
#endif
        }
예제 #16
0
 /// <summary>初始化</summary>
 /// <param name="member"></param>
 /// <param name="innerException"></param>
 public XSerializationException(IObjectMemberInfo member, Exception innerException)
     : base((innerException != null ? innerException.Message : null) + (member != null ? "[Member:" + member.Name + "]" : null), innerException)
 {
     _Member = member;
 }
예제 #17
0
 /// <summary>初始化</summary>
 /// <param name="member"></param>
 /// <param name="message"></param>
 /// <param name="innerException"></param>
 public XSerializationException(IObjectMemberInfo member, String message, Exception innerException)
     : base(message + (member != null ? "[Member:" + member.Name + "]" : null), innerException)
 {
     _Member = member;
 }
예제 #18
0
 /// <summary>初始化</summary>
 /// <param name="member"></param>
 /// <param name="message"></param>
 public XSerializationException(IObjectMemberInfo member, String message) : base(message) { _Member = member; }
예제 #19
0
 /// <summary>初始化</summary>
 /// <param name="member"></param>
 public XSerializationException(IObjectMemberInfo member) { _Member = member; }
예제 #20
0
파일: WriterBase.cs 프로젝트: xlfj5211/esb
 /// <summary>写入对象成员</summary>
 /// <param name="value">要写入的对象</param>
 /// <param name="type">要写入的成员类型</param>
 /// <param name="member">成员</param>
 /// <param name="index">成员索引</param>
 /// <param name="callback">处理成员的方法</param>
 /// <returns>是否写入成功</returns>
 protected virtual Boolean OnWriteMember(Object value, Type type, IObjectMemberInfo member, Int32 index, WriteObjectCallback callback)
 {
     return(callback(this, member[value], type, callback));
 }