Exemple #1
0
 /// <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");
     }
     string[] value = baseValueMessage.GetValue <string[]>();
     proxy.WriteInt32(value.Length);
     if (value.Length == 0)
     {
         return;
     }
     for (int j = 0; j < value.Length; j++)
     {
         string elementValue = value[j];
         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);
         }
     }
 }
Exemple #2
0
 /// <summary>
 ///     注册扩展类型数据valueStored
 /// </summary>
 /// <param name="valueStored">数据处理器实例</param>
 /// <exception cref="ArgumentNullException">参数不能为空</exception>
 public static void Regist(BaseValueStored valueStored)
 {
     if (valueStored == null)
     {
         throw new ArgumentNullException("valueStored");
     }
     _valueStoreds[valueStored.TypeId] = valueStored;
 }
Exemple #3
0
 /// <summary>
 ///     设置一个指定key的属性值
 /// </summary>
 /// <param name="id">设置属性对应的id</param>
 /// <param name="baseValueStored">设置属性的value</param>
 /// <exception cref="ArgumentNullException">baseValueStored不能为空</exception>
 public virtual ResourceBlock SetAttribute(byte id, BaseValueStored baseValueStored)
 {
     if (baseValueStored == null)
     {
         throw new ArgumentNullException("baseValueStored");
     }
     _valueStoreds[id] = baseValueStored;
     return(this);
 }
 /// <summary>
 ///     第三方数据转换成元数据
 /// </summary>
 /// <param name="proxy">内存段实例</param>
 /// <param name="baseValueMessage">存储属性的实例对象</param>
 /// <exception cref="ArgumentNullException">参数不能为空</exception>
 public unsafe void ValueProcessor(IMemorySegmentProxy proxy, BaseValueStored baseValueMessage)
 {
     if (proxy == null)
     {
         throw new ArgumentNullException("proxy");
     }
     if (baseValueMessage == null)
         throw new ArgumentNullException("baseValueMessage");
     fixed(IntPtr *pByte = baseValueMessage.GetValue <IntPtr[]>())
     proxy.WriteMemory(pByte, (uint)baseValueMessage.GetValue <IntPtr[]>().Length *Size.IntPtr);
 }
Exemple #5
0
 /// <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");
     }
     proxy.WriteMemory(baseValueMessage.GetValue <byte[]>(), 0, (uint)baseValueMessage.GetValue <byte[]>().Length);
 }
Exemple #6
0
 /// <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);
     }
 }
Exemple #7
0
        /// <summary>
        ///     注册扩展类型数据valueStored
        /// </summary>
        /// <param name="type">数据处理器类型</param>
        /// <exception cref="ArgumentNullException">参数不能为空</exception>
        public static void Regist(Type type)
        {
            BaseValueStored valueStored = (BaseValueStored)type.GetTypeInfo().Assembly.CreateInstance(type.FullName);

            if (valueStored == null)
            {
                throw new ArgumentNullException(nameof(type));
            }
            if (valueStored.TypeId <= MetadataObjectSetting.TYPE_BOUNDARY)
            {
                throw new ArgumentException(string.Format("#Extensionable Type id can not be setted in System Type range, boundary type id is {0}", MetadataObjectSetting.TYPE_BOUNDARY));
            }
            if (valueStored.Clone() == null)
            {
                throw new NullReferenceException("#There is a null reference object instance when called Clone method.");
            }
            if (!(valueStored.Clone().GetType().GetTypeInfo().IsSubclassOf(typeof(BaseValueStored))))
            {
                throw new ArgumentException("#Generated instance of Clone method was not the sub class of BaseValueStored");
            }
            _valueStoreds[valueStored.TypeId] = valueStored;
        }
Exemple #8
0
 /// <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");
     }
     IPEndPoint[] array = baseValueMessage.GetValue <IPEndPoint[]>();
     if (array == null)
     {
         throw new NullReferenceException(string.Format("#The processed value is null, type Id is: {0}", baseValueMessage.TypeId));
     }
     if (array.Length == 0)
     {
         return;
     }
     for (int i = 0; i < array.Length; i++)
     {
         proxy.WriteIPEndPoint(array[i]);
     }
 }
Exemple #9
0
        /// <summary>
        ///     将一个二进制元数据转换为对象字段
        /// </summary>
        /// <param name="byteData">需要反序列化的二进制数组</param>
        /// <param name="offset">内存段偏移</param>
        /// <param name="length">内存段长度</param>
        public static MetadataContainer GetObject(byte[] byteData, uint offset, uint length)
        {
            MetadataContainer metadataObject = new MetadataContainer();

            #region 解析数据部分

            //记录当前解析数据段的绝对偏移起始位置
            uint offsetFlag = offset;
            //计算当前解析数据段的总长度
            uint totalLength = BitConverter.ToUInt32(byteData, (int)offset);
            if (byteData.Length - offset < length - 4)
            {
                throw new System.Exception("Illegal binary data length! #length: " + totalLength);
            }
            //计算当前解析数据段的markRange个数(即包含元素的个数)
            //offset+4表示计算完后偏移4bytes(当前数据段总长所占的4Bytes)
            ushort markRangeCount = BitConverter.ToUInt16(byteData, (int)(offset += 4));
            //计算当前解析数据段markRange所占总字节数
            uint markRangeLength = (uint)(markRangeCount * 5);
            //offset+2表示偏移2bytes(当前数据段mark Range个数所占的2Bytes)
            offset += 2;
            MarkRange markRange1 = new MarkRange(), markRange2 = new MarkRange();
            for (int i = 0; i < markRangeCount; i++)
            {
                uint offsetFlagStart, offsetFlagEnd;
                //解析mark Range
                //提取当前数据段前一个元素的ID
                markRange1.Id = (i == 0) ? byteData[offset + 5 * i] : markRange2.Id;
                //提取当前数据段前一个元素的Flag
                markRange1.Flag = (i == 0) ? BitConverter.ToUInt32(byteData, (int)(offset + 5 * i + 1)) : markRange2.Flag;
                //提取当前数据段后一个元素的ID
                markRange2.Id = (i == markRangeCount - 1) ? (byte)0 : byteData[offset + 5 * (i + 1)];
                //提取当前数据段后一个元素的Flag
                markRange2.Flag = (i == markRangeCount - 1) ? 0 : BitConverter.ToUInt32(byteData, (int)(offset + 5 * (i + 1) + 1));
                //计算偏移
                //当前解析数据段某一个元素的相对偏移起始位置(相对于当前的mark range)
                offsetFlagStart = (markRange1.Flag & 0xFFFFFF00) >> 8;
                //当前解析数据段某一个元素的相对偏移结束位置(相对于当前的mark range)
                if (i < markRangeCount - 1)
                {
                    offsetFlagEnd = (markRange2.Flag & 0xFFFFFF00) >> 8;
                }
                else
                {
                    offsetFlagEnd = totalLength - 6 - markRangeLength;
                }
                //提取当前解析数据段某一个元素的类型值
                PropertyTypes idFlag = (PropertyTypes)byteData[offset + 5 * i + 1];
                //计算当前解析数据段某一个元素的绝对偏移起始位置(整个完整数据段的偏移)
                uint offsetStart = offsetFlagStart + 6 + markRangeLength + offsetFlag;
                //计算当前解析数据段某一个元素的长度(所占字节数)
                uint offsetLength = offsetFlagEnd - offsetFlagStart;
                //开始解析........................................................................
                //系统内置类型
                if ((byte)idFlag <= MetadataObjectSetting.TYPE_BOUNDARY)
                {
                    BaseValueStored valueStored = (BaseValueStored)SystemTypeMapping.GetValueStored((byte)idFlag).Clone();
                    valueStored.ToData(metadataObject, markRange1.Id, byteData, (int)offsetStart, offsetLength);
                }
                //用户自定义类型
                else
                {
                    BaseValueStored valueStored = (BaseValueStored)ExtensionTypeMapping.GetValueStored((byte)idFlag).Clone();
                    valueStored.ToData(metadataObject, markRange1.Id, byteData, (int)offsetStart, offsetLength);
                }
            }

            #endregion

            return(metadataObject);
        }