private object ReadValue(Stream input, ValueTag tag, Type objectType) { switch (tag.Type) { case ValueType.Array: { return(this.ReadArray(input, tag, objectType)); } case ValueType.Object: { return(objectType == typeof(object) || objectType == typeof(Dictionary <string, object>) ? this.ReadDictionary(input, tag, objectType) : this.ReadObject(input, tag, objectType)); } case ValueType.Bool: { return(input.ReadValueU8() != 0); } case ValueType.String: { return(this.ReadString(input, tag, objectType)); } case ValueType.Int32: { return(input.ReadValueS32(Endian.Little)); } case ValueType.Int64: { return(input.ReadValueS64(Endian.Little)); } case ValueType.Float64: { return(input.ReadValueF64(Endian.Little)); } case ValueType.Guid: { return(input.ReadValueGuid(Endian.Big)); } case ValueType.SHA1: { var bytes = input.ReadBytes(20); return(new SHA1Hash(bytes)); } case ValueType.Bytes: { var length = input.ReadPackedValueUInt32(); var basePosition = input.Position; var endPosition = basePosition + length; if (endPosition > input.Length) { throw new EndOfStreamException(); } var value = input.ReadBytes(length); if (input.Position != endPosition) { throw new FormatException(); } return(value); } } throw new NotSupportedException(); }
public object Deserialize(Stream input, Type objectType) { var tag = new ValueTag(input.ReadValueU8()); return(this.ReadValue(input, tag, objectType)); }
private object ReadArray(Stream input, ValueTag tag, Type objectType) { if (objectType == null) { throw new ArgumentNullException("objectType"); } if (objectType != typeof(object) && objectType.IsArray == false && IsGenericList(objectType) == false) { throw new ArgumentException("objectType"); } var length = input.ReadPackedValueUInt32(); var basePosition = input.Position; var endPosition = basePosition + length; if (endPosition > input.Length) { throw new EndOfStreamException(); } Type elementType; if (objectType == typeof(object)) { elementType = typeof(object); } else if (objectType.IsArray == true) { // Type[] elementType = objectType.GetElementType(); } else { // List<Type> elementType = objectType.GetGenericArguments().Single(); } var listType = typeof(List <>).MakeGenericType(elementType); var list = (IList)Activator.CreateInstance(listType); var elementTag = new ValueTag(input.ReadValueU8()); if (elementTag.Type != ValueType.Invalid) { do { var elementValue = this.ReadValue(input, elementTag, elementType); list.Add(elementValue); elementTag = new ValueTag(input.ReadValueU8()); }while (elementTag.Type != ValueType.Invalid); } if (input.Position != endPosition) { throw new FormatException(); } if (objectType == typeof(object) || objectType.IsArray != true) { // just want the list return(list); } var array = Array.CreateInstance(elementType, list.Count); for (int i = 0; i < list.Count; i++) { array.SetValue(list[i], i); } return(array); }