int IKeyDescriber.ToObject(byte[] buffer, int begin, out Type type) { int id; int count = Varint.BufferToNumber(buffer, begin, out id); type = _Get(id); return(count); }
int ITypeDescriber.ToObject(byte[] buffer, int begin, out object instance) { try { var constructor = _Type.GetConstructors().OrderBy(c => c.GetParameters().Length).Select(c => c).FirstOrDefault(); if (constructor != null) { var argTypes = constructor.GetParameters().Select(info => info.ParameterType).ToArray(); var objArgs = new object[argTypes.Length]; for (int i = 0; i < argTypes.Length; i++) { objArgs[i] = Activator.CreateInstance(argTypes[i]); } instance = Activator.CreateInstance(_Type, objArgs); } else { instance = Activator.CreateInstance(_Type); } var offset = begin; ulong validLength; offset += Varint.BufferToNumber(buffer, offset, out validLength); for (var i = 0ul; i < validLength; i++) { ulong index; offset += Varint.BufferToNumber(buffer, offset, out index); Type valueType; offset += _TypeSet.Get().ToObject(buffer, offset, out valueType); var filed = _Fields[index]; var describer = _TypeSet.Get(valueType); object valueInstance; offset += describer.ToObject(buffer, offset, out valueInstance); filed.SetValue(instance, valueInstance); } return(offset - begin); } catch (Exception ex) { throw new DescriberException(typeof(ClassDescriber), _Type, "ToObject", ex); } }
int ITypeDescriber.ToObject(byte[] buffer, int begin, out object instnace) { try { var offset = begin; ulong count; offset += Varint.BufferToNumber(buffer, offset, out count); var array = Activator.CreateInstance(_Type, (int)count) as IList; instnace = array; ulong validCount; offset += Varint.BufferToNumber(buffer, offset, out validCount); for (var i = 0UL; i < validCount; i++) { var index = 0LU; offset += Varint.BufferToNumber(buffer, offset, out index); Type objType; offset += _TypeSet.Get().ToObject(buffer, offset, out objType); var describer = _TypeSet.Get(objType); object value; offset += describer.ToObject(buffer, offset, out value); array[(int)index] = value; } return(offset - begin); } catch (Exception ex) { throw new DescriberException(typeof(ArrayDescriber), _Type, "ToObject", ex);; } }