/// <summary>写入对象</summary> /// <param name="value">目标对象</param> /// <param name="type">类型</param> /// <returns></returns> public override Boolean Write(Object value, Type type) { if (value == null) { return(false); } // 不支持基本类型 if (Type.GetTypeCode(type) != TypeCode.Object) { return(false); } var ms = GetMembers(type); WriteLog("JsonWrite类{0} 共有成员{1}个", type.Name, ms.Count); Host.Hosts.Push(value); var context = new AccessorContext { Host = Host, Type = type, Value = value }; // 获取成员 foreach (var member in ms) { if (IgnoreMembers != null && IgnoreMembers.Contains(member.Name)) { continue; } var mtype = GetMemberType(member); context.Member = Host.Member = member; var v = value.GetValue(member); WriteLog(" {0}.{1} {2}", type.Name, member.Name, v); // 成员访问器优先 if (value is IMemberAccessor ac && ac.Read(Host, context)) { continue; } if (!Host.Write(v, mtype)) { Host.Hosts.Pop(); return(false); } } Host.Hosts.Pop(); return(true); }
/// <summary>把消息写入到数据流中</summary> /// <param name="formatter">序列化</param> /// <param name="context">上下文</param> public virtual Boolean Write(IFormatterX formatter, AccessorContext context) => false;
/// <summary>尝试读取指定类型对象</summary> /// <param name="type"></param> /// <param name="value"></param> /// <returns></returns> public override Boolean TryRead(Type type, ref Object value) { if (type == null) { if (value == null) { return(false); } type = value.GetType(); } // 不支持基本类型 if (Type.GetTypeCode(type) != TypeCode.Object) { return(false); } // 不支持基类不是Object的特殊类型 //if (type.BaseType != typeof(Object)) return false; if (!type.As <Object>()) { return(false); } var ms = GetMembers(type); WriteLog("JsonRead类{0} 共有成员{1}个", type.Name, ms.Count); if (value == null) { value = type.CreateInstance(); } Host.Hosts.Push(value); var context = new AccessorContext { Host = Host, Type = type, Value = value }; // 获取成员 for (var i = 0; i < ms.Count; i++) { var member = ms[i]; if (IgnoreMembers != null && IgnoreMembers.Contains(member.Name)) { continue; } var mtype = GetMemberType(member); context.Member = Host.Member = member; WriteLog(" {0}.{1}", member.DeclaringType.Name, member.Name); // 成员访问器优先 if (value is IMemberAccessor ac && ac.Read(Host, context)) { continue; } Object v = null; if (!Host.TryRead(mtype, ref v)) { Host.Hosts.Pop(); return(false); } value.SetValue(member, v); } Host.Hosts.Pop(); return(true); }