private int WriteMembers(ClassDataContract classContract, LocalBuilder extensionDataLocal, ClassDataContract derivedMostClassContract) { int num = (classContract.BaseContract == null) ? 0 : this.WriteMembers(classContract.BaseContract, extensionDataLocal, derivedMostClassContract); this.ilg.Call(this.contextArg, XmlFormatGeneratorStatics.IncrementItemCountMethod, classContract.Members.Count); int index = 0; while (index < classContract.Members.Count) { DataMember member = classContract.Members[index]; Type memberType = member.MemberType; LocalBuilder builder = null; if (member.IsGetOnlyCollection) { this.ilg.Load(this.contextArg); this.ilg.Call(XmlFormatGeneratorStatics.StoreIsGetOnlyCollectionMethod); } if (!member.EmitDefaultValue) { builder = this.LoadMemberValue(member); this.ilg.IfNotDefaultValue(builder); } bool flag = DataContractJsonSerializer.CheckIfXmlNameRequiresMapping(classContract.MemberNames[index]); if (flag || !this.TryWritePrimitive(memberType, builder, member.MemberInfo, null, null, index + this.childElementIndex)) { if (flag) { this.ilg.Call(null, JsonFormatGeneratorStatics.WriteJsonNameWithMappingMethod, this.xmlWriterArg, this.memberNamesArg, index + this.childElementIndex); } else { this.WriteStartElement(null, index + this.childElementIndex); } if (builder == null) { builder = this.LoadMemberValue(member); } this.WriteValue(builder); this.WriteEndElement(); } if (classContract.HasExtensionData) { this.ilg.Call(this.contextArg, XmlFormatGeneratorStatics.WriteExtensionDataMethod, this.xmlWriterArg, extensionDataLocal, num); } if (!member.EmitDefaultValue) { if (member.IsRequired) { this.ilg.Else(); this.ilg.Call(null, XmlFormatGeneratorStatics.ThrowRequiredMemberMustBeEmittedMethod, member.Name, classContract.UnderlyingType); } this.ilg.EndIf(); } index++; num++; } this.typeIndex++; this.childElementIndex += classContract.Members.Count; return(num); }
int WriteMembers(ClassDataContract classContract, LocalBuilder extensionDataLocal, ClassDataContract derivedMostClassContract) { int memberCount = (classContract.BaseContract == null) ? 0 : WriteMembers(classContract.BaseContract, extensionDataLocal, derivedMostClassContract); ilg.Call(contextArg, XmlFormatGeneratorStatics.IncrementItemCountMethod, classContract.Members.Count); for (int i = 0; i < classContract.Members.Count; i++, memberCount++) { DataMember member = classContract.Members[i]; Type memberType = member.MemberType; LocalBuilder memberValue = null; if (member.IsGetOnlyCollection) { ilg.Load(contextArg); ilg.Call(XmlFormatGeneratorStatics.StoreIsGetOnlyCollectionMethod); } if (!member.EmitDefaultValue) { memberValue = LoadMemberValue(member); ilg.IfNotDefaultValue(memberValue); } bool requiresNameAttribute = DataContractJsonSerializer.CheckIfXmlNameRequiresMapping(classContract.MemberNames[i]); if (requiresNameAttribute || !TryWritePrimitive(memberType, memberValue, member.MemberInfo, null /*arrayItemIndex*/, null /*nameLocal*/, i + childElementIndex)) { // Note: DataContractSerializer has member-conflict logic here to deal with the schema export // requirement that the same member can't be of two different types. if (requiresNameAttribute) { ilg.Call(null, JsonFormatGeneratorStatics.WriteJsonNameWithMappingMethod, xmlWriterArg, memberNamesArg, i + childElementIndex); } else { WriteStartElement(null /*nameLocal*/, i + childElementIndex); } if (memberValue == null) { memberValue = LoadMemberValue(member); } WriteValue(memberValue); WriteEndElement(); } if (classContract.HasExtensionData) { ilg.Call(contextArg, XmlFormatGeneratorStatics.WriteExtensionDataMethod, xmlWriterArg, extensionDataLocal, memberCount); } if (!member.EmitDefaultValue) { if (member.IsRequired) { ilg.Else(); ilg.Call(null, XmlFormatGeneratorStatics.ThrowRequiredMemberMustBeEmittedMethod, member.Name, classContract.UnderlyingType); } ilg.EndIf(); } } typeIndex++; childElementIndex += classContract.Members.Count; return(memberCount); }
int WriteMembers(ClassDataContract classContract, ExtensionDataObject extensionData, ClassDataContract derivedMostClassContract) { int memberCount = (classContract.BaseContract == null) ? 0 : WriteMembers(classContract.BaseContract, extensionData, derivedMostClassContract); context.IncrementItemCount(classContract.Members.Count); for (int i = 0; i < classContract.Members.Count; i++, memberCount++) { DataMember member = classContract.Members[i]; Type memberType = member.MemberType; object memberValue = null; if (member.IsGetOnlyCollection) { context.StoreIsGetOnlyCollection(); } bool doWrite = true, hasMemberValue = false; if (!member.EmitDefaultValue) { hasMemberValue = true; memberValue = LoadMemberValue(member); doWrite = !IsDefaultValue(memberType, memberValue); } if (doWrite) { bool requiresNameAttribute = DataContractJsonSerializer.CheckIfXmlNameRequiresMapping(classContract.MemberNames [i]); if (requiresNameAttribute || !TryWritePrimitive(memberType, hasMemberValue ? () => memberValue : (Func <object>)null, member.MemberInfo, null /*arrayItemIndex*/, null /*nameLocal*/, i + childElementIndex)) { // Note: DataContractSerializer has member-conflict logic here to deal with the schema export // requirement that the same member can't be of two different types. if (requiresNameAttribute) { XmlObjectSerializerWriteContextComplexJson.WriteJsonNameWithMapping(writer, memberNames, i + childElementIndex); } else { WriteStartElement(null /*nameLocal*/, i + childElementIndex); } if (memberValue == null) { memberValue = LoadMemberValue(member); } WriteValue(memberType, memberValue); WriteEndElement(); } if (classContract.HasExtensionData) { context.WriteExtensionData(writer, extensionData, memberCount); } } else if (!member.EmitDefaultValue) { if (member.IsRequired) { XmlObjectSerializerWriteContext.ThrowRequiredMemberMustBeEmitted(member.Name, classContract.UnderlyingType); } } } typeIndex++; childElementIndex += classContract.Members.Count; return(memberCount); }