/// <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); }
/// <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)); }
/// <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; }
/// <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); }
/// <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); }
/// <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; }
/// <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)); }
/// <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)); }
/// <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])); }
/// <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; }
/// <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; }
/// <summary>初始化</summary> /// <param name="member"></param> /// <param name="message"></param> public XSerializationException(IObjectMemberInfo member, String message) : base(message) { _Member = member; }
/// <summary>初始化</summary> /// <param name="member"></param> public XSerializationException(IObjectMemberInfo member) { _Member = member; }
/// <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 }
/// <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)); }