/// <summary> /// 获取缓存项,如果没有,将自动创建一个 /// </summary> /// <param name="entityType">实体类类型</param> /// <returns></returns> public static EntityFields Item(Type entityType) { if (dict.ContainsKey(entityType.FullName)) { return(dict[entityType.FullName]); } EntityFields ef = new EntityFields(); if (ef.InitEntity(entityType)) //2015.2.5 修改 { dict.Add(entityType.FullName, ef); } return(ef); }
/// <summary> /// 获取属性的值,如果没有,将返回属性类型的默认值;注意该方法调用将发起属性获取事件 。 /// </summary> /// <param name="propertyName"></param> /// <returns></returns> public object GetPropertyValueWithEvent(string propertyName) { EntityFields ef = EntityFieldsCache.Item(this.GetType()); string fieldName = ef.GetPropertyField(propertyName); if (fieldName != null) { this.OnPropertyGeting(fieldName); object result = PropertyList(fieldName); if (result == null || result == DBNull.Value) { Type propType = ef.GetPropertyType(fieldName); result = Activator.CreateInstance(propType);//活动类型的默认值 } return(result); } return(new ArgumentOutOfRangeException("不存在指定的属性名:" + propertyName)); }
/// <summary> /// 获取或者设置指定属性名称的值,属性名必须是一个PDF.NET实体类的属性(调用了getProperty 和 setProperty方法),不能是普通属性。 /// 如果属性不存在,获取该属性值将为null,而设置该属性值将抛出异常。 /// </summary> /// <param name="propertyName">属性名称</param> /// <returns></returns> public object this[string propertyName] { get { EntityFields ef = EntityFieldsCache.Item(this.GetType()); string fieldName = ef.GetPropertyField(propertyName); if (fieldName != null) { this.OnPropertyGeting(fieldName); return(PropertyList(fieldName)); } //获取虚拟的字段值 return(PropertyList(propertyName));; } set { EntityFields ef = EntityFieldsCache.Item(this.GetType()); string fieldName = ef.GetPropertyField(propertyName); if (fieldName != null) { //如果是实体类基础定义的字段,必须检查设置的值得类型 //2017.5.5 增加类型相容转换处理,包括空字符串,可用于大批量文本数据导入情况 Type fieldType = ef.GetPropertyType(fieldName); try { object Value = CommonUtil.ChangeType(value, fieldType); this.setProperty(fieldName, Value); } catch (Exception ex) { throw new ArgumentException("实体类的属性字段" + propertyName + " 需要" + fieldType.Name + " 类型的值,但准备赋予的值不是该类型!", ex); } } else { //设置虚拟的字段值 this.setProperty(propertyName, value); } } }
/// <summary> /// 获取指定字段名对应的描述 /// </summary> /// <param name="fieldName">字段名</param> /// <returns>字段描述</returns> public string GetFieldDescription(string fieldName) { int index = -1; EntityFields ef = EntityFieldsCache.Item(this.GetType()); for (int i = 0; i < ef.Fields.Length; i++) { string s = ef.Fields[i]; if (s == fieldName) { index = i; break; } } if (index == -1) { throw new ArgumentOutOfRangeException(fieldName + " 不在实体类定义的字段范围内。"); } return(GetFieldDescriptions()[index]); }
/// <summary> /// 获取或者设置指定属性名称的值,属性名必须是一个PDF.NET实体类的属性(调用了getProperty 和 setProperty方法),不能是普通属性。 /// 如果属性不存在,获取该属性值将为null,而设置该属性值将抛出异常。 /// </summary> /// <param name="propertyName">属性名称</param> /// <returns></returns> public object this[string propertyName] { get { EntityFields ef = EntityFieldsCache.Item(this.GetType()); string fieldName = ef.GetPropertyField(propertyName); if (fieldName != null) { this.OnPropertyGeting(fieldName); return(PropertyList(fieldName)); } //获取虚拟的字段值 return(PropertyList(propertyName));; } set { EntityFields ef = EntityFieldsCache.Item(this.GetType()); string fieldName = ef.GetPropertyField(propertyName); if (fieldName != null) { //如果是实体类基础定义的字段,必须检查设置的值得类型 if (value != null) { Type fieldType = ef.GetPropertyType(fieldName); if (value.GetType() != fieldType) { throw new ArgumentException("实体类的属性字段" + propertyName + " 需要" + fieldType.Name + " 类型的值,但准备赋予的值不是该类型!"); } } this.setProperty(fieldName, value); } else { //设置虚拟的字段值 this.setProperty(propertyName, value); } } }
protected internal static void BinaryDeserializeCommon(BinaryReader br, EntityFields ef,EntityBase factEntity) { int flag = br.ReadInt32(); if (flag != PdfNetSerialize.ENTITY_ITEM_FLAG) throw new Exception("反序列化错误:不是有效的实体类数据格式!"); byte FieldFlag; for (int i = 0; i < factEntity.PropertyValues.Length; i++) { object obj = null; FieldFlag = br.ReadByte(); if (FieldFlag == 0) { obj = DBNull.Value; } else { Type propertyType = ef.GetPropertyType(factEntity.PropertyNames[i]); if (propertyType == null) throw new Exception("PDF.NET实体类序列化错误:未知的实体属性类型,请检查实体类的属性和字段定义是否匹配。"); switch (propertyType.Name) { case "Int32": obj = br.ReadInt32(); break; case "String": obj = br.ReadString();//继续读一个字符串 break; case "DateTime": obj = DateTime.FromBinary(br.ReadInt64()); break; case "Int16": obj = br.ReadInt16(); break; case "Int64": obj = br.ReadInt64(); break; case "Single": obj = br.ReadSingle(); break; case "Double": obj = br.ReadDouble(); break; case "Decimal": obj = br.ReadDecimal(); break; case "Boolean": obj = br.ReadBoolean(); break; case "Byte": obj = br.ReadByte(); break; case "Char": obj = br.ReadChar(); break; case "Byte[]": int length = br.ReadInt32(); if (length > 0) obj = br.ReadBytes(length); break; } } factEntity.PropertyValues[i] = obj; if (FieldFlag == byte.MaxValue) { break;//属性已经读取完成,不再处理当前实体的其它字段 } } }
/// <summary> /// 二进制序列化 /// </summary> /// <param name="entity">实体类实例</param> /// <returns>字节数组</returns> public static byte[] BinarySerialize(EntityBase entity) { MemoryStream ms = new MemoryStream(); BinaryWriter bw = new BinaryWriter(ms); Type factEntityType = entity.GetType(); EntityFields ef = EntityFieldsCache.Item(factEntityType); byte b; //写入实体类标记 bw.Write(ENTITY_ITEM_FLAG); int length = entity.PropertyValues.Length - 1; for (int i = 0; i <= length; i++) { object obj = entity.PropertyValues[i]; //if (obj == System.DBNull.Value) obj = null;//DBNull.Value在Convert 的时候会失败 //为每个属性添加null标记 if (obj == System.DBNull.Value || obj == null) { b = 0;//NULL标记 } else { if (length == i) { b = byte.MaxValue; } else { b = 1; //如果标志位为 byte.MaxValue ,则表示已经写入所有的属性字段,可用于以后添加实体属性但又要成功读取原有的记录 } } bw.Write(b); //写入标记 if (b > 0) { Type propertyType = ef.GetPropertyType(entity.PropertyNames[i]); if (propertyType == null) { throw new Exception("PDF.NET实体类序列化错误:未知的实体属性类型,请检查实体类的属性和字段定义是否匹配。"); } switch (propertyType.Name) { case "Int32": bw.Write(Convert.ToInt32(obj)); break; case "String": bw.Write(Convert.ToString(obj)); break; case "DateTime": bw.Write(Convert.ToDateTime(obj).ToBinary()); break; case "Int16": bw.Write(Convert.ToInt16(obj)); break; case "Int64": bw.Write(Convert.ToInt64(obj)); break; case "Single": bw.Write(Convert.ToSingle(obj)); break; case "Double": bw.Write(Convert.ToDouble(obj)); break; case "Decimal": bw.Write(Convert.ToDecimal(obj)); break; case "Boolean": bw.Write(Convert.ToBoolean(obj)); break; case "Byte": bw.Write(Convert.ToByte(obj)); break; case "Char": bw.Write(Convert.ToChar(obj)); break; case "Byte[]": Byte[] buffer = (Byte[])obj; bw.Write(buffer.Length); //写入字节序列的长度 if (buffer.Length > 0) { bw.Write(buffer); } break; } } } bw.Close(); ms.Close(); return(ms.ToArray()); }
protected internal static void BinaryDeserializeCommon(BinaryReader br, EntityFields ef, EntityBase factEntity) { int flag = br.ReadInt32(); if (flag != PdfNetSerialize.ENTITY_ITEM_FLAG) { throw new Exception("反序列化错误:不是有效的实体类数据格式!"); } byte FieldFlag; for (int i = 0; i < factEntity.PropertyValues.Length; i++) { object obj = null; FieldFlag = br.ReadByte(); if (FieldFlag == 0) { obj = DBNull.Value; } else { Type propertyType = ef.GetPropertyType(factEntity.PropertyNames[i]); if (propertyType == null) { throw new Exception("PDF.NET实体类序列化错误:未知的实体属性类型,请检查实体类的属性和字段定义是否匹配。"); } switch (propertyType.Name) { case "Int32": obj = br.ReadInt32(); break; case "String": obj = br.ReadString(); //继续读一个字符串 break; case "DateTime": obj = DateTime.FromBinary(br.ReadInt64()); break; case "Int16": obj = br.ReadInt16(); break; case "Int64": obj = br.ReadInt64(); break; case "Single": obj = br.ReadSingle(); break; case "Double": obj = br.ReadDouble(); break; case "Decimal": obj = br.ReadDecimal(); break; case "Boolean": obj = br.ReadBoolean(); break; case "Byte": obj = br.ReadByte(); break; case "Char": obj = br.ReadChar(); break; case "Byte[]": int length = br.ReadInt32(); if (length > 0) { obj = br.ReadBytes(length); } break; } } factEntity.PropertyValues[i] = obj; if (FieldFlag == byte.MaxValue) { break;//属性已经读取完成,不再处理当前实体的其它字段 } } }
/// <summary> /// 获取缓存项,如果没有,将自动创建一个 /// </summary> /// <param name="entityType">实体类类型</param> /// <returns></returns> public static EntityFields Item(Type entityType) { if (dict.ContainsKey(entityType.FullName)) return dict[entityType.FullName]; EntityFields ef = new EntityFields(); if (ef.Init(entityType)) dict.Add(entityType.FullName, ef); return ef; }