Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
 /// <summary>把消息写入到数据流中</summary>
 /// <param name="formatter">序列化</param>
 /// <param name="context">上下文</param>
 public virtual Boolean Write(IFormatterX formatter, AccessorContext context) => false;
Exemplo n.º 3
0
        /// <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);
        }