Deveel.Data.Serialization.BinarySerializer.DeserializeType C# (CSharp) 메소드

DeserializeType() 개인적인 메소드

private DeserializeType ( BinaryReader reader, Type graphType ) : object
reader System.IO.BinaryReader
graphType System.Type
리턴 object
		private object DeserializeType(BinaryReader reader, Type graphType) {
			object obj;

#if !PCL
			if (graphType.IsValueType) {
#else
			if (graphType.IsValueType()) {
#endif
				obj = Activator.CreateInstance(graphType);
			} else {
				var ctor = GetDefaultConstructor(graphType);
				if (ctor == null)
					throw new NotSupportedException(String.Format("The type '{0}' does not specify any default empty constructor.", graphType));

				obj = ctor.Invoke(new object[0]);
			}

#if PCL
			var fields = graphType.GetRuntimeFields().Where(x => !x.IsStatic && !x.IsDefined(typeof(NonSerializedAttribute)));
			var properties =
				graphType.GetRuntimeProperties()
					.Where(x => !x.IsStatic() && x.CanWrite && !x.IsDefined(typeof (NonSerializedAttribute)));
#else
			var fields = graphType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
				.Where(member => !member.IsDefined(typeof (NonSerializedAttribute), false));
			var properties = graphType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
				.Where(member => member.CanWrite && !member.IsDefined(typeof (NonSerializedAttribute), false));
#endif

			var members = new List<MemberInfo>();
			members.AddRange(fields.Cast<MemberInfo>());
			members.AddRange(properties.Cast<MemberInfo>());

			var values = new Dictionary<string, object>();
			ReadValues(reader, Encoding, values);

			foreach (var member in members) {
				var memberName = member.Name;
				object value;

				if (values.TryGetValue(memberName, out value)) {
					// TODO: convert the source value to the destination value...

					if (member is PropertyInfo) {
						var property = (PropertyInfo) member;
						property.SetValue(obj, value, null);
					} else if (member is FieldInfo) {
						var field = (FieldInfo) member;
						field.SetValue(obj, value);
					}
				}
			}

			return obj;
		}

		private ConstructorInfo GetDefaultConstructor(Type type) {
#if PCL
			return type.GetConstructorOrNull(true);
#else
			var ctors = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			foreach (var ctor in ctors) {
				if (ctor.GetParameters().Length == 0)
					return ctor;
			}

			return null;
#endif
		}