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
}