void InternalSerialize(MethodInfo methodInfo, LocalBuilder memberValue, Type memberType, bool writeXsiType) { ilg.Load(contextArg); ilg.Load(xmlWriterArg); ilg.Load(memberValue); ilg.ConvertValue(memberValue.LocalType, Globals.TypeOfObject); LocalBuilder typeHandleValue = ilg.DeclareLocal(typeof(RuntimeTypeHandle), "typeHandleValue"); ilg.Call(null, typeof(Type).GetMethod("GetTypeHandle"), memberValue); ilg.Stloc(typeHandleValue); ilg.LoadAddress(typeHandleValue); ilg.Ldtoken(memberType); ilg.Call(typeof(RuntimeTypeHandle).GetMethod("Equals", new Type[] { typeof(RuntimeTypeHandle) })); ilg.Load(writeXsiType); ilg.Load(DataContract.GetId(memberType.TypeHandle)); ilg.Ldtoken(memberType); ilg.Call(methodInfo); }
private void InternalDeserialize(LocalBuilder value, Type type, string name, string ns) { _ilg.Load(_contextArg); _ilg.Load(_xmlReaderArg); Type declaredType = type; _ilg.Load(DataContract.GetId(declaredType.TypeHandle)); _ilg.Ldtoken(declaredType); _ilg.Load(name); _ilg.Load(ns); _ilg.Call(XmlFormatGeneratorStatics.InternalDeserializeMethod); _ilg.ConvertValue(Globals.TypeOfObject, type); _ilg.Stloc(value); }
private void InternalSerialize(MethodInfo methodInfo, LocalBuilder memberValue, Type memberType, bool writeXsiType) { _ilg.Load(_contextArg); _ilg.Load(_xmlWriterArg); _ilg.Load(memberValue); _ilg.ConvertValue(memberValue.LocalType, Globals.TypeOfObject); //In SL GetTypeHandle throws MethodAccessException as its internal and extern. //So as a workaround, call XmlObjectSerializerWriteContext.IsMemberTypeSameAsMemberValue that //does the actual comparison and returns the bool value we care. _ilg.Call(null, XmlFormatGeneratorStatics.IsMemberTypeSameAsMemberValue, memberValue, memberType); _ilg.Load(writeXsiType); _ilg.Load(DataContract.GetId(memberType.TypeHandle)); _ilg.Ldtoken(memberType); _ilg.Call(methodInfo); }
void InternalDeserialize(LocalBuilder value, Type type, string name, string ns) { ilg.Load(contextArg); ilg.Load(xmlReaderArg); Type declaredType = type.IsPointer ? Globals.TypeOfReflectionPointer : type; ilg.Load(DataContract.GetId(declaredType.TypeHandle)); ilg.Ldtoken(declaredType); ilg.Load(name); ilg.Load(ns); ilg.Call(XmlFormatGeneratorStatics.InternalDeserializeMethod); if (type.IsPointer) { ilg.Call(XmlFormatGeneratorStatics.UnboxPointer); } else { ilg.ConvertValue(Globals.TypeOfObject, type); } ilg.Stloc(value); }