IResourceData readResourceData(List <UserResourceType> userTypes, int size) { uint code = readUInt32(reader); switch ((ResourceTypeCode)code) { case ResourceTypeCode.Null: return(resourceDataCreator.createNull()); case ResourceTypeCode.String: return(resourceDataCreator.create(reader.ReadString())); case ResourceTypeCode.Boolean: return(resourceDataCreator.create(reader.ReadBoolean())); case ResourceTypeCode.Char: return(resourceDataCreator.create((char)reader.ReadUInt16())); case ResourceTypeCode.Byte: return(resourceDataCreator.create(reader.ReadByte())); case ResourceTypeCode.SByte: return(resourceDataCreator.create(reader.ReadSByte())); case ResourceTypeCode.Int16: return(resourceDataCreator.create(reader.ReadInt16())); case ResourceTypeCode.UInt16: return(resourceDataCreator.create(reader.ReadUInt16())); case ResourceTypeCode.Int32: return(resourceDataCreator.create(reader.ReadInt32())); case ResourceTypeCode.UInt32: return(resourceDataCreator.create(reader.ReadUInt32())); case ResourceTypeCode.Int64: return(resourceDataCreator.create(reader.ReadInt64())); case ResourceTypeCode.UInt64: return(resourceDataCreator.create(reader.ReadUInt64())); case ResourceTypeCode.Single: return(resourceDataCreator.create(reader.ReadSingle())); case ResourceTypeCode.Double: return(resourceDataCreator.create(reader.ReadDouble())); case ResourceTypeCode.Decimal: return(resourceDataCreator.create(reader.ReadDecimal())); case ResourceTypeCode.DateTime: return(resourceDataCreator.create(new DateTime(reader.ReadInt64()))); case ResourceTypeCode.TimeSpan: return(resourceDataCreator.create(new TimeSpan(reader.ReadInt64()))); case ResourceTypeCode.ByteArray: return(resourceDataCreator.create(reader.ReadBytes(reader.ReadInt32()))); default: int userTypeIndex = (int)(code - (uint)ResourceTypeCode.UserTypes); if (userTypeIndex < 0 || userTypeIndex >= userTypes.Count) { throw new ResourceReaderException(string.Format("Invalid resource data code: {0}", code)); } return(resourceDataCreator.createSerialized(reader.ReadBytes(size))); } }