/// <summary> /// 从第三方客户数据转换为元数据 /// </summary> /// <param name="proxy">内存片段代理器</param> /// <param name="attribute">字段属性</param> /// <param name="analyseResult">分析结果</param> /// <param name="target">目标对象实例</param> /// <param name="isArrayElement">当前写入的值是否为数组元素标示</param> public override void Process(IMemorySegmentProxy proxy, IntellectPropertyAttribute attribute, ToBytesAnalyseResult analyseResult, object target, bool isArrayElement = false, bool isNullable = false) { uint value; if (!isNullable) { value = analyseResult.GetValue <uint>(target); } else { uint?nullableValue = analyseResult.GetValue <uint?>(target); if (nullableValue == null) { if (!attribute.IsRequire) { return; } throw new PropertyNullValueException( string.Format(ExceptionMessage.EX_PROPERTY_VALUE, attribute.Id, analyseResult.Property.Name, analyseResult.Property.PropertyType)); } value = (uint)nullableValue; } if (attribute.AllowDefaultNull && value.Equals(DefaultValue.UInt32) && !isArrayElement) { return; } proxy.WriteByte((byte)attribute.Id); proxy.WriteUInt32(value); }
/// <summary> /// 将一个IntellectObject数组转换成byte数组的形式 /// </summary> /// <param name="value">值</param> /// <exception cref="UnexpectedValueException">结果错误</exception> /// <exception cref="ArgumentNullException">参数不能为空</exception> public static byte[] BindIntellectObjectArray(IntellectObject[] value) { if (value == null) { throw new ArgumentNullException("value"); } MemoryAllotter.Instance.Initialize(); IMemorySegmentProxy proxy = MemorySegmentProxyFactory.Create(); proxy.WriteUInt32((uint)value.Length); for (int i = 0; i < value.Length; i++) { IntellectObject elementObj = value[i]; if (elementObj == null) { proxy.WriteUInt16(0); } else { MemoryPosition currentPostion = proxy.GetPosition(); proxy.Skip(2U); int length = IntellectObjectEngine.ToBytes(elementObj, proxy); proxy.WriteBackUInt16(currentPostion, (ushort)length); } } return(proxy.GetBytes()); }
/// <summary> /// 第三方数据转换成元数据 /// </summary> /// <param name="proxy">内存段实例</param> /// <param name="baseValueMessage">存储属性的实例对象</param> /// <exception cref="ArgumentNullException">参数不能为空</exception> public void ValueProcessor(IMemorySegmentProxy proxy, BaseValueStored baseValueMessage) { if (proxy == null) { throw new ArgumentNullException("proxy"); } if (baseValueMessage == null) { throw new ArgumentNullException("baseValueMessage"); } ResourceBlock[] value = baseValueMessage.GetValue <ResourceBlock[]>(); proxy.WriteUInt32((uint)value.Length); for (int i = 0; i < value.Length; i++) { if (value[i] == null) { proxy.WriteUInt32(0); continue; } MetadataObjectEngine.ToBytes(value[i], proxy); } }
/// <summary> /// 序列化当前事务唯一标示 /// </summary> /// <param name="id">如果是以智能对象的方式进行序列化,则此ID为标签ID</param> /// <param name="serializationType">序列化方式</param> /// <param name="identity">被序列化的事务唯一标示</param> /// <param name="proxy">内存片段代理器</param> public static void Serialize(byte id, IdentitySerializationTypes serializationType, TCPTransactionIdentity identity, IMemorySegmentProxy proxy) { if (serializationType == IdentitySerializationTypes.IntellectObject) { //writes attribute id. proxy.WriteByte(id); //writes TCP transaction identity total length. proxy.WriteInt32(19); } proxy.WriteByte((byte)identity.IdentityType); proxy.WriteByte((byte)(identity.IsRequest ? 1 : 0)); proxy.WriteByte((byte)(identity.IsOneway ? 1 : 0)); proxy.WriteIPEndPoint((IPEndPoint)identity.EndPoint); proxy.WriteUInt32(identity.MessageId); }
/// <summary> /// 序列化当前事务唯一标示 /// </summary> /// <param name="id">如果是以智能对象的方式进行序列化,则此ID为标签ID</param> /// <param name="serializationType">序列化方式</param> /// <param name="identity">被序列化的事务唯一标示</param> /// <param name="proxy">内存片段代理器</param> public static void Serialize(byte id, IdentitySerializationTypes serializationType, NamedPipeTransactionIdentity identity, IMemorySegmentProxy proxy) { if (serializationType == IdentitySerializationTypes.IntellectObject) { //writes attribute id. proxy.WriteByte(id); //writes NamedPipe transaction identity total length. proxy.WriteInt32(15); } proxy.WriteByte((byte)identity.IdentityType); proxy.WriteByte((byte)(identity.IsRequest ? 1 : 0)); proxy.WriteByte((byte)(identity.IsOneway ? 1 : 0)); proxy.WriteUInt64(((NamedPipeEndPoint)identity.EndPoint).GetPipeCodeId()); proxy.WriteUInt32(identity.MessageId); }
/// <summary> /// 从第三方客户数据转换为元数据 /// <para>* 此方法将会被轻量级的DataHelper所使用,并且写入的数据将不会拥有编号(Id)</para> /// </summary> /// <param name="proxy">内存片段代理器</param> /// <param name="target">目标对象实例</param> /// <param name="isArrayElement">当前写入的值是否为数组元素标示</param> /// <param name="isNullable">是否为可空字段标示</param> public unsafe override void Process(IMemorySegmentProxy proxy, object target, bool isArrayElement = false, bool isNullable = false) { uint[] array = (uint[])target; if (array == null || array.Length == 0) { return; } if (array.Length > 10) fixed(uint *pByte = array) proxy.WriteMemory(pByte, (uint)array.Length * Size.UInt32); else { for (int i = 0; i < array.Length; i++) { proxy.WriteUInt32(array[i]); } } }
/// <summary> /// 从第三方客户数据转换为元数据 /// <para>* 此方法将会被轻量级的DataHelper所使用,并且写入的数据将不会拥有编号(Id)</para> /// </summary> /// <param name="proxy">内存片段代理器</param> /// <param name="target">目标对象实例</param> /// <param name="isArrayElement">当前写入的值是否为数组元素标示</param> /// <param name="isNullable">是否为可空字段标示</param> public override void Process(IMemorySegmentProxy proxy, object target, bool isArrayElement = false, bool isNullable = false) { uint value; if (!isNullable) { value = (uint)target; } else { if (target == null) { return; } value = (uint)target; } proxy.WriteUInt32(value); }
/// <summary> /// 从第三方客户数据转换为元数据 /// </summary> /// <param name="proxy">内存片段代理器</param> /// <param name="attribute">字段属性</param> /// <param name="analyseResult">分析结果</param> /// <param name="target">目标对象实例</param> /// <param name="isArrayElement">当前写入的值是否为数组元素标示</param> /// <param name="isNullable">是否为可空字段标示</param> public override void Process(IMemorySegmentProxy proxy, IntellectPropertyAttribute attribute, ToBytesAnalyseResult analyseResult, object target, bool isArrayElement = false, bool isNullable = false) { uint[] value = analyseResult.GetValue <uint[]>(target); if (value == null) { if (!attribute.IsRequire) { return; } throw new PropertyNullValueException(string.Format(ExceptionMessage.EX_PROPERTY_VALUE, attribute.Id, analyseResult.Property.Name, analyseResult.Property.PropertyType)); } //id(1) + total length(4) + rank(4) proxy.WriteByte((byte)attribute.Id); MemoryPosition position = proxy.GetPosition(); proxy.Skip(4U); proxy.WriteInt32(value.Length); if (value.Length == 0) { proxy.WriteBackInt32(position, 4); return; } if (value.Length > 10) { unsafe { fixed(uint *pByte = value) proxy.WriteMemory(pByte, (uint)value.Length * Size.UInt32); } } else { for (int i = 0; i < value.Length; i++) { proxy.WriteUInt32(value[i]); } } proxy.WriteBackInt32(position, (int)(value.Length * Size.UInt32 + 4)); }
/// <summary> /// 从第三方客户数据转换为元数据 /// <para>* 此方法将会被轻量级的DataHelper所使用,并且写入的数据将不会拥有编号(Id)</para> /// </summary> /// <param name="proxy">内存片段代理器</param> /// <param name="target">目标对象实例</param> /// <param name="isArrayElement">当前写入的值是否为数组元素标示</param> /// <param name="isNullable">是否为可空字段标示</param> public override void Process(IMemorySegmentProxy proxy, object target, bool isArrayElement = false, bool isNullable = false) { string[] array = (string[])target; if (array == null || array.Length == 0) { return; } proxy.WriteUInt32((uint)array.Length); for (int i = 0; i < array.Length; i++) { string elementValue = array[i]; if (string.IsNullOrEmpty(elementValue)) { proxy.WriteUInt16(0); } else { byte[] elementData = Encoding.UTF8.GetBytes(elementValue); proxy.WriteUInt16((ushort)elementData.Length); proxy.WriteMemory(elementData, 0U, (uint)elementData.Length); } } }