/// <summary> /// 把对象数据写入到写入器 /// </summary> /// <param name="writer"></param> public virtual void Write(DME_BinaryWriter writer) { Write(this, writer, true, true, false); }
/// <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。"); }
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; }
/// <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); } } }