コード例 #1
0
 /// <summary>
 /// 把对象数据写入到写入器
 /// </summary>
 /// <param name="writer"></param>
 public virtual void Write(DME_BinaryWriter writer)
 {
     Write(this, writer, true, true, false);
 }
コード例 #2
0
 /// <summary>
 /// 把对象成员的数据写入到写入器
 /// </summary>
 /// <param name="target">目标对象</param>
 /// <param name="writer">写入器</param>
 /// <param name="member">成员</param>
 /// <param name="encodeInt">使用7Bit编码整数</param>
 /// <param name="allowNull">是否允许对象为空,如果允许,则写入时增加一个字节表示对象是否为空</param>
 protected virtual void WriteMember(Object target, DME_BinaryWriter writer, DME_MemberInfo member, Boolean encodeInt, Boolean allowNull)
 {
     MemberTypes mt = member.Member.MemberType;
     if (mt == MemberTypes.Field || mt == MemberTypes.Property)
     {
         if (!TryWrite(target, writer, member, encodeInt, allowNull)) throw new InvalidOperationException("无法读取数据,如果是复杂类型请实现IBinaryAccessor接口。");
     }
     else
         throw new ArgumentOutOfRangeException("member", "成员只能是FieldInfo或PropertyInfo。");
 }
コード例 #3
0
        Boolean TryWrite(Object target, DME_BinaryWriter writer, DME_MemberInfo member, Boolean encodeInt, Boolean allowNull)
        {
            Object value = member.GetValue(target);

            // 基本类型
            if (writer.WriteValue(value, encodeInt)) return true;

            // 允许空时,增加一个字节表示对象是否为空
            if (value == null)
            {
                if (allowNull) writer.Write((Byte)0);
                return true;
            }
            if (allowNull) writer.Write((Byte)1);

            // 接口支持
            //if (Array.IndexOf(member.Type.GetInterfaces(), typeof(IBinaryAccessor)) >= 0)
            if (typeof(DME_IBinaryAccessor).IsAssignableFrom(member.Type))
            {
                // 调用接口
                DME_IBinaryAccessor accessor = value as DME_IBinaryAccessor;
                accessor.Write(writer);
                return true;
            }

            #region 数组
            if (member.Type.IsArray)
            {
                // 特殊处理字节数组
                if (member.Type == typeof(Byte[]))
                {
                    writer.Write((Byte[])value);
                    return true;
                }

                Array arr = value as Array;
                if (arr != null)
                {

                }
            }
            #endregion

            #region 枚举
            if (typeof(IEnumerable).IsAssignableFrom(member.Type))
            {
                // 先写元素个数
                IEnumerable arr = value as IEnumerable;
                Int32 count = 0;
                foreach (Object item in arr)
                {
                    count++;
                }
                // 写入长度
                writer.WriteEncoded(count);

                foreach (Object item in arr)
                {
                    // 允许空时,增加一个字节表示对象是否为空
                    if (item == null)
                    {
                        if (allowNull) writer.Write((Byte)0);
                        continue;
                    }
                    if (allowNull) writer.Write((Byte)1);

                    if (!writer.WriteValue(item, encodeInt))
                        Write(item, writer, encodeInt, allowNull, member.Member.MemberType == MemberTypes.Property);
                }
                return true;
            }
            #endregion

            return false;
        }
コード例 #4
0
        /// <summary>
        /// 把指定对象写入到写入器,指定写入属性还是字段
        /// </summary>
        /// <param name="target">目标对象</param>
        /// <param name="writer">写入器</param>
        /// <param name="encodeInt">使用7Bit编码整数</param>
        /// <param name="allowNull">是否允许对象为空,如果允许,则写入时增加一个字节表示对象是否为空</param>
        /// <param name="isProperty"></param>
        protected void Write(Object target, DME_BinaryWriter writer, Boolean encodeInt, Boolean allowNull, Boolean isProperty)
        {
            if (target == null) throw new ArgumentNullException("target", "目标对象不能为空!");

            if (isProperty)
            {
                PropertyInfo[] pis = FindProperties(target.GetType());
                if (pis == null || pis.Length < 1) return;

                foreach (PropertyInfo item in pis)
                {
                    WriteMember(target, writer, item, encodeInt, allowNull);
                }
            }
            else
            {
                FieldInfo[] fis = FindFields(target.GetType());
                if (fis == null || fis.Length < 1) return;

                foreach (FieldInfo item in fis)
                {
                    WriteMember(target, writer, item, encodeInt, allowNull);
                }
            }
        }