2 using System.Collections.Generic;
4 using System.Reflection;
8 namespace System.Runtime.Serialization.Json
10 internal partial class JsonFormatReaderGenerator
12 partial class CriticalHelper
14 internal JsonFormatClassReaderDelegate GenerateClassReader(ClassDataContract classContract)
16 return (XmlReaderDelegator xr, XmlObjectSerializerReadContextComplexJson ctx, XmlDictionaryString emptyDictionaryString, XmlDictionaryString [] memberNames) => new JsonFormatReaderInterpreter (classContract).ReadFromJson (xr, ctx, emptyDictionaryString, memberNames);
19 internal JsonFormatCollectionReaderDelegate GenerateCollectionReader(CollectionDataContract collectionContract)
21 return (XmlReaderDelegator xr, XmlObjectSerializerReadContextComplexJson ctx, XmlDictionaryString emptyDS, XmlDictionaryString inm, CollectionDataContract cc) => new JsonFormatReaderInterpreter (collectionContract, false).ReadCollectionFromJson (xr, ctx, emptyDS, inm, cc);
24 internal JsonFormatGetOnlyCollectionReaderDelegate GenerateGetOnlyCollectionReader(CollectionDataContract collectionContract)
26 return (XmlReaderDelegator xr, XmlObjectSerializerReadContextComplexJson ctx, XmlDictionaryString emptyDS, XmlDictionaryString inm, CollectionDataContract cc) => new JsonFormatReaderInterpreter (collectionContract, true).ReadGetOnlyCollectionFromJson (xr, ctx, emptyDS, inm, cc);
31 class JsonFormatReaderInterpreter
33 public JsonFormatReaderInterpreter (ClassDataContract classContract)
35 this.classContract = classContract;
38 public JsonFormatReaderInterpreter (CollectionDataContract collectionContract, bool isGetOnly)
40 this.collectionContract = collectionContract;
41 this.is_get_only_collection = isGetOnly;
44 bool is_get_only_collection;
46 ClassDataContract classContract;
48 CollectionDataContract collectionContract;
52 XmlReaderDelegator xmlReader;
53 XmlObjectSerializerReadContextComplexJson context;
55 XmlDictionaryString [] memberNames = null;
56 XmlDictionaryString emptyDictionaryString = null;
57 XmlDictionaryString itemName = null;
58 XmlDictionaryString itemNamespace = null;
60 public object ReadFromJson (XmlReaderDelegator xmlReader, XmlObjectSerializerReadContextComplexJson context, XmlDictionaryString emptyDictionaryString, XmlDictionaryString[] memberNames)
63 this.xmlReader = xmlReader;
64 this.context = context;
65 this.emptyDictionaryString = emptyDictionaryString;
66 this.memberNames = memberNames;
68 //DemandSerializationFormatterPermission(classContract);
69 //DemandMemberAccessPermission(memberAccessFlag);
70 CreateObject (classContract);
72 context.AddNewObject (objectLocal);
73 InvokeOnDeserializing (classContract);
75 string objectId = null;
77 if (classContract.IsISerializable)
78 ReadISerializable (classContract);
80 ReadClass (classContract);
81 if (Globals.TypeOfIDeserializationCallback.IsAssignableFrom (classContract.UnderlyingType))
82 ((IDeserializationCallback) objectLocal).OnDeserialization (null);
83 InvokeOnDeserialized(classContract);
84 if (!InvokeFactoryMethod (classContract)) {
86 // Do a conversion back from DateTimeOffsetAdapter to DateTimeOffset after deserialization.
87 // DateTimeOffsetAdapter is used here for deserialization purposes to bypass the ISerializable implementation
88 // on DateTimeOffset; which does not work in partial trust.
90 if (classContract.UnderlyingType == Globals.TypeOfDateTimeOffsetAdapter)
91 objectLocal = DateTimeOffsetAdapter.GetDateTimeOffset ((DateTimeOffsetAdapter) objectLocal);
92 // else - do we have to call CodeInterpreter.ConvertValue()? I guess not...
97 public object ReadCollectionFromJson (XmlReaderDelegator xmlReader, XmlObjectSerializerReadContextComplexJson context, XmlDictionaryString emptyDictionaryString, XmlDictionaryString itemName, CollectionDataContract collectionContract)
99 #region GenerateCollectionReaderHelper
101 this.xmlReader = xmlReader;
102 this.context = context;
103 this.emptyDictionaryString = emptyDictionaryString;
104 this.itemName = itemName;
106 this.collectionContract = collectionContract;
110 ReadCollection (collectionContract);
115 public void ReadGetOnlyCollectionFromJson (XmlReaderDelegator xmlReader, XmlObjectSerializerReadContextComplexJson context, XmlDictionaryString emptyDictionaryString, XmlDictionaryString itemName, CollectionDataContract collectionContract)
117 #region GenerateCollectionReaderHelper
119 this.xmlReader = xmlReader;
120 this.context = context;
121 this.emptyDictionaryString = emptyDictionaryString;
122 this.itemName = itemName;
124 this.collectionContract = collectionContract;
128 ReadGetOnlyCollection (collectionContract);
131 void CreateObject (ClassDataContract classContract)
133 Type type = objectType = classContract.UnderlyingType;
134 if (type.IsValueType && !classContract.IsNonAttributedType)
135 type = Globals.TypeOfValueType;
137 if (classContract.UnderlyingType == Globals.TypeOfDBNull)
138 objectLocal = DBNull.Value;
139 else if (classContract.IsNonAttributedType) {
140 if (type.IsValueType)
141 objectLocal = FormatterServices.GetUninitializedObject (type);
143 objectLocal = classContract.GetNonAttributedTypeConstructor ().Invoke (new object [0]);
146 objectLocal = CodeInterpreter.ConvertValue (XmlFormatReaderGenerator.UnsafeGetUninitializedObject (DataContract.GetIdForInitialization (classContract)), Globals.TypeOfObject, type);
149 void InvokeOnDeserializing (ClassDataContract classContract)
151 if (classContract.BaseContract != null)
152 InvokeOnDeserializing (classContract.BaseContract);
153 if (classContract.OnDeserializing != null)
154 classContract.OnDeserializing.Invoke (objectLocal, new object [] {context.GetStreamingContext ()});
157 void InvokeOnDeserialized (ClassDataContract classContract)
159 if (classContract.BaseContract != null)
160 InvokeOnDeserialized (classContract.BaseContract);
161 if (classContract.OnDeserialized != null)
162 classContract.OnDeserialized.Invoke (objectLocal, new object [] {context.GetStreamingContext ()});
165 bool HasFactoryMethod (ClassDataContract classContract)
167 return Globals.TypeOfIObjectReference.IsAssignableFrom (classContract.UnderlyingType);
170 bool InvokeFactoryMethod (ClassDataContract classContract)
172 if (HasFactoryMethod (classContract)) {
173 objectLocal = CodeInterpreter.ConvertValue (context.GetRealObject ((IObjectReference) objectLocal, Globals.NewObjectId), Globals.TypeOfObject, classContract.UnderlyingType);
179 void ReadISerializable (ClassDataContract classContract)
181 ConstructorInfo ctor = classContract.UnderlyingType.GetConstructor (Globals.ScanAllMembers, null, JsonFormatGeneratorStatics.SerInfoCtorArgs, null);
183 throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError (XmlObjectSerializer.CreateSerializationException (SR.GetString (SR.SerializationInfo_ConstructorNotFound, DataContract.GetClrTypeFullName (classContract.UnderlyingType))));
184 context.ReadSerializationInfo (xmlReader, classContract.UnderlyingType);
185 ctor.Invoke (objectLocal, new object [] {context.GetStreamingContext ()});
188 void ReadClass (ClassDataContract classContract)
190 if (classContract.HasExtensionData) {
191 ExtensionDataObject extensionData = new ExtensionDataObject ();
192 ReadMembers (classContract, extensionData);
193 ClassDataContract currentContract = classContract;
194 while (currentContract != null) {
195 MethodInfo extensionDataSetMethod = currentContract.ExtensionDataSetMethod;
196 if (extensionDataSetMethod != null)
197 extensionDataSetMethod.Invoke (objectLocal, new object [] {extensionData});
198 currentContract = currentContract.BaseContract;
202 ReadMembers (classContract, null);
205 void ReadMembers (ClassDataContract classContract, ExtensionDataObject extensionData)
207 int memberCount = classContract.MemberNames.Length;
208 context.IncrementItemCount (memberCount);
210 int memberIndex = -1;
212 // JSON intrinsic part.
213 BitFlagsGenerator expectedElements = new BitFlagsGenerator (memberCount);
214 byte [] requiredElements = new byte [expectedElements.GetLocalCount ()];
215 SetRequiredElements (classContract, requiredElements);
216 SetExpectedElements (expectedElements, 0 /*startIndex*/);
218 while (XmlObjectSerializerReadContext.MoveToNextElement (xmlReader)) {
219 int idx; // used as in "switch (idx)" in the original source.
220 idx = context.GetJsonMemberIndex (xmlReader, memberNames, memberIndex, extensionData);
223 ReadMembers (idx, classContract, expectedElements, ref memberIndex);
226 if (!CheckRequiredElements (expectedElements, requiredElements))
227 XmlObjectSerializerReadContextComplexJson.ThrowMissingRequiredMembers (objectLocal, memberNames, expectedElements.LoadArray (), requiredElements);
230 int ReadMembers (int index, ClassDataContract classContract, BitFlagsGenerator expectedElements, ref int memberIndex)
232 int memberCount = (classContract.BaseContract == null) ? 0 : ReadMembers (index, classContract.BaseContract, expectedElements,
235 if (memberCount <= index && index < memberCount + classContract.Members.Count) {
236 DataMember dataMember = classContract.Members [index - memberCount];
237 Type memberType = dataMember.MemberType;
239 memberIndex = memberCount;
240 if (!expectedElements.Load (index))
241 XmlObjectSerializerReadContextComplexJson.ThrowDuplicateMemberException (objectLocal, memberNames, memberIndex);
243 if (dataMember.IsGetOnlyCollection) {
244 var value = CodeInterpreter.GetMember (dataMember.MemberInfo, objectLocal);
245 context.StoreCollectionMemberInfo (value);
246 ReadValue (memberType, dataMember.Name);
248 var value = ReadValue (memberType, dataMember.Name);
249 CodeInterpreter.SetMember (dataMember.MemberInfo, objectLocal, value);
252 ResetExpectedElements (expectedElements, index);
254 return memberCount + classContract.Members.Count;
257 bool CheckRequiredElements (BitFlagsGenerator expectedElements, byte [] requiredElements)
259 for (int i = 0; i < requiredElements.Length; i++)
260 if ((expectedElements.GetLocal(i) & requiredElements[i]) != 0)
265 int SetRequiredElements (ClassDataContract contract, byte [] requiredElements)
267 int memberCount = (contract.BaseContract == null) ? 0 :
268 SetRequiredElements (contract.BaseContract, requiredElements);
269 List<DataMember> members = contract.Members;
270 for (int i = 0; i < members.Count; i++, memberCount++) {
271 if (members[i].IsRequired)
272 BitFlagsGenerator.SetBit (requiredElements, memberCount);
277 void SetExpectedElements (BitFlagsGenerator expectedElements, int startIndex)
279 int memberCount = expectedElements.GetBitCount ();
280 for (int i = startIndex; i < memberCount; i++)
281 expectedElements.Store (i, true);
284 void ResetExpectedElements (BitFlagsGenerator expectedElements, int index)
286 expectedElements.Store (index, false);
289 object ReadValue (Type type, string name)
291 var valueType = type;
293 bool shouldAssignNullableValue = false;
295 while (type.IsGenericType && type.GetGenericTypeDefinition () == Globals.TypeOfNullable) {
297 type = type.GetGenericArguments () [0];
300 PrimitiveDataContract primitiveContract = PrimitiveDataContract.GetPrimitiveDataContract (type);
301 if ((primitiveContract != null && primitiveContract.UnderlyingType != Globals.TypeOfObject) || nullables != 0 || type.IsValueType) {
302 context.ReadAttributes (xmlReader);
303 string objectId = context.ReadIfNullOrRef (xmlReader, type, DataContract.IsTypeSerializable (type));
305 if (objectId == Globals.NullObjectId) {
308 value = Activator.CreateInstance (valueType);
309 else if (type.IsValueType)
310 throw new SerializationException (SR.GetString (SR.ValueTypeCannotBeNull, DataContract.GetClrTypeFullName (type)));
313 } else if (objectId == string.Empty) {
316 // Compare against Globals.NewObjectId, which is set to string.Empty
318 objectId = context.GetObjectId ();
320 if (type.IsValueType) {
321 if (!string.IsNullOrEmpty (objectId))
322 throw new SerializationException (SR.GetString (SR.ValueTypeCannotHaveId, DataContract.GetClrTypeFullName(type)));
324 object innerValueRead = null;
326 shouldAssignNullableValue = true;
328 if (primitiveContract != null && primitiveContract.UnderlyingType != Globals.TypeOfObject) {
329 value = primitiveContract.XmlFormatReaderMethod.Invoke (xmlReader, new object [0]);
330 if (!type.IsValueType)
331 context.AddNewObject (value);
334 value = InternalDeserialize (type, name);
337 if (type.IsValueType)
338 throw new SerializationException (SR.GetString (SR.ValueTypeCannotHaveRef, DataContract.GetClrTypeFullName (type)));
340 value = CodeInterpreter.ConvertValue (context.GetExistingObject (objectId, type, name, string.Empty), Globals.TypeOfObject, type);
343 if (shouldAssignNullableValue) {
344 if (objectId != Globals.NullObjectId)
345 value = WrapNullableObject (type, value, valueType, nullables);
349 value = InternalDeserialize (type, name);
354 object InternalDeserialize (Type type, string name)
356 Type declaredType = type.IsPointer ? Globals.TypeOfReflectionPointer : type;
357 var obj = context.InternalDeserialize (xmlReader, DataContract.GetId (declaredType.TypeHandle), declaredType.TypeHandle, name, string.Empty);
360 // wow, there is no way to convert void* to object in strongly typed way...
361 return JsonFormatGeneratorStatics.UnboxPointer.Invoke (null, new object [] {obj});
363 return CodeInterpreter.ConvertValue (obj, Globals.TypeOfObject, type);
366 object WrapNullableObject (Type innerType, object innerValue, Type outerType, int nullables)
368 var outerValue = innerValue;
369 for (int i = 1; i < nullables; i++) {
370 Type type = Globals.TypeOfNullable.MakeGenericType (innerType);
371 outerValue = Activator.CreateInstance (type, new object[] { outerValue });
374 return Activator.CreateInstance (outerType, new object[] { outerValue });
378 void ReadCollection (CollectionDataContract collectionContract)
380 Type type = collectionContract.UnderlyingType;
381 Type itemType = collectionContract.ItemType;
382 bool isArray = (collectionContract.Kind == CollectionKind.Array);
384 ConstructorInfo constructor = collectionContract.Constructor;
386 if (type.IsInterface) {
387 switch (collectionContract.Kind) {
388 case CollectionKind.GenericDictionary:
389 type = Globals.TypeOfDictionaryGeneric.MakeGenericType (itemType.GetGenericArguments ());
390 constructor = type.GetConstructor (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Globals.EmptyTypeArray, null);
392 case CollectionKind.Dictionary:
393 type = Globals.TypeOfHashtable;
394 constructor = type.GetConstructor (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Globals.EmptyTypeArray, null);
396 case CollectionKind.Collection:
397 case CollectionKind.GenericCollection:
398 case CollectionKind.Enumerable:
399 case CollectionKind.GenericEnumerable:
400 case CollectionKind.List:
401 case CollectionKind.GenericList:
402 type = itemType.MakeArrayType ();
409 if (type.IsValueType)
410 // FIXME: this is not what the original code does.
411 objectLocal = FormatterServices.GetUninitializedObject (type);
413 objectLocal = constructor.Invoke (new object [0]);
414 context.AddNewObject (objectLocal);
418 bool canReadSimpleDictionary = collectionContract.Kind == CollectionKind.Dictionary ||
419 collectionContract.Kind == CollectionKind.GenericDictionary;
421 bool readSimpleDictionary = canReadSimpleDictionary & context.UseSimpleDictionaryFormat;
422 if (readSimpleDictionary)
423 ReadSimpleDictionary (collectionContract, itemType);
425 string objectId = context.GetObjectId ();
427 bool canReadPrimitiveArray = false, readResult = false;
428 if (isArray && TryReadPrimitiveArray (itemType, out readResult))
429 canReadPrimitiveArray = true;
431 if (!canReadPrimitiveArray) {
432 object growingCollection = null;
434 growingCollection = Array.CreateInstance (itemType, 32);
437 // FIXME: I cannot find i++ part, but without that it won't work as expected.
438 for (; i < int.MaxValue; i++) {
439 if (IsStartElement (this.itemName, this.emptyDictionaryString)) {
440 context.IncrementItemCount (1);
441 object value = ReadCollectionItem (collectionContract, itemType);
443 MethodInfo ensureArraySizeMethod = XmlFormatGeneratorStatics.EnsureArraySizeMethod.MakeGenericMethod (itemType);
444 growingCollection = ensureArraySizeMethod.Invoke (null, new object [] {growingCollection, i});
445 ((Array) growingCollection).SetValue (value, i);
447 StoreCollectionValue (objectLocal, itemType, value, collectionContract);
450 else if (IsEndElement ())
453 HandleUnexpectedItemInCollection (ref i);
457 MethodInfo trimArraySizeMethod = XmlFormatGeneratorStatics.TrimArraySizeMethod.MakeGenericMethod (itemType);
458 objectLocal = trimArraySizeMethod.Invoke (null, new object [] {growingCollection, i});
459 context.AddNewObjectWithId (objectId, objectLocal);
463 context.AddNewObjectWithId (objectId, objectLocal);
467 void ReadSimpleDictionary (CollectionDataContract collectionContract, Type keyValueType)
469 Type[] keyValueTypes = keyValueType.GetGenericArguments ();
470 Type keyType = keyValueTypes [0];
471 Type valueType = keyValueTypes [1];
473 int keyTypeNullableDepth = 0;
474 Type keyTypeOriginal = keyType;
475 while (keyType.IsGenericType && keyType.GetGenericTypeDefinition () == Globals.TypeOfNullable) {
476 keyTypeNullableDepth++;
477 keyType = keyType.GetGenericArguments () [0];
480 ClassDataContract keyValueDataContract = (ClassDataContract)collectionContract.ItemContract;
481 DataContract keyDataContract = keyValueDataContract.Members [0].MemberTypeContract;
483 KeyParseMode keyParseMode = KeyParseMode.Fail;
485 if (keyType == Globals.TypeOfString || keyType == Globals.TypeOfObject) {
486 keyParseMode = KeyParseMode.AsString;
487 } else if (keyType.IsEnum) {
488 keyParseMode = KeyParseMode.UsingParseEnum;
489 } else if (keyDataContract.ParseMethod != null) {
490 keyParseMode = KeyParseMode.UsingCustomParse;
493 if (keyParseMode == KeyParseMode.Fail) {
494 ThrowSerializationException (
496 SR.KeyTypeCannotBeParsedInSimpleDictionary,
497 DataContract.GetClrTypeFullName (collectionContract.UnderlyingType),
498 DataContract.GetClrTypeFullName (keyType)));
500 XmlNodeType nodeType;
502 while ((nodeType = xmlReader.MoveToContent ()) != XmlNodeType.EndElement) {
503 if (nodeType != XmlNodeType.Element)
504 ThrowUnexpectedStateException (XmlNodeType.Element);
506 context.IncrementItemCount (1);
508 var jsonMemberName = XmlObjectSerializerReadContextComplexJson.GetJsonMemberName (xmlReader);
511 if (keyParseMode == KeyParseMode.UsingParseEnum)
512 key = Enum.Parse (keyType, jsonMemberName);
513 else if (keyParseMode == KeyParseMode.UsingCustomParse)
514 key = keyDataContract.ParseMethod.Invoke (null, new object [] {jsonMemberName});
516 if (keyTypeNullableDepth > 0) {
517 var keyOriginal = WrapNullableObject (keyType, key, valueType, keyTypeNullableDepth);
521 var value = ReadValue (valueType, String.Empty);
522 collectionContract.AddMethod.Invoke (objectLocal, new object[] {key, value});
527 void ReadGetOnlyCollection (CollectionDataContract collectionContract)
529 Type type = collectionContract.UnderlyingType;
530 Type itemType = collectionContract.ItemType;
531 bool isArray = (collectionContract.Kind == CollectionKind.Array);
534 objectLocal = context.GetCollectionMember ();
536 bool canReadSimpleDictionary =
537 collectionContract.Kind == CollectionKind.Dictionary ||
538 collectionContract.Kind == CollectionKind.GenericDictionary;
540 bool readSimple = canReadSimpleDictionary && context.UseSimpleDictionaryFormat;
542 if (objectLocal == null)
543 XmlObjectSerializerReadContext.ThrowNullValueReturnedForGetOnlyCollectionException (type);
545 ReadSimpleDictionary(collectionContract, itemType);
546 context.CheckEndOfArray (xmlReader, size, this.itemName, emptyDictionaryString);
550 //check that items are actually going to be deserialized into the collection
551 if (IsStartElement (this.itemName, this.emptyDictionaryString)) {
552 if (objectLocal == null)
553 XmlObjectSerializerReadContext.ThrowNullValueReturnedForGetOnlyCollectionException (type);
557 size = ((Array) objectLocal).Length;
558 for (int i = 0; i < int.MaxValue;) {
559 if (IsStartElement (this.itemName, this.emptyDictionaryString)) {
560 context.IncrementItemCount (1);
561 var value = ReadCollectionItem (collectionContract, itemType);
564 XmlObjectSerializerReadContext.ThrowArrayExceededSizeException (size, type);
566 ((Array) objectLocal).SetValue (value, i);
568 StoreCollectionValue (objectLocal, itemType, value, collectionContract);
571 else if (IsEndElement())
574 HandleUnexpectedItemInCollection (ref i);
576 context.CheckEndOfArray (xmlReader, size, this.itemName, this.emptyDictionaryString);
582 bool TryReadPrimitiveArray (Type itemType, out bool readResult)
585 PrimitiveDataContract primitiveContract = PrimitiveDataContract.GetPrimitiveDataContract (itemType);
586 if (primitiveContract == null)
589 string readArrayMethod = null;
590 switch (Type.GetTypeCode (itemType))
592 case TypeCode.Boolean:
593 readArrayMethod = "TryReadBooleanArray";
595 case TypeCode.Decimal:
596 readArrayMethod = "TryReadDecimalArray";
599 readArrayMethod = "TryReadInt32Array";
602 readArrayMethod = "TryReadInt64Array";
604 case TypeCode.Single:
605 readArrayMethod = "TryReadSingleArray";
607 case TypeCode.Double:
608 readArrayMethod = "TryReadDoubleArray";
610 case TypeCode.DateTime:
611 readArrayMethod = "TryReadJsonDateTimeArray";
616 if (readArrayMethod != null) {
617 var mi = typeof (JsonReaderDelegator).GetMethod (readArrayMethod, Globals.ScanAllMembers);
618 var args = new object [] {context, itemName, emptyDictionaryString, -1, objectLocal};
619 readResult = (bool) mi.Invoke ((JsonReaderDelegator) xmlReader, args);
620 objectLocal = args.Last ();
626 object ReadCollectionItem (CollectionDataContract collectionContract, Type itemType)
628 if (collectionContract.Kind == CollectionKind.Dictionary || collectionContract.Kind == CollectionKind.GenericDictionary) {
629 context.ResetAttributes ();
630 var revisedContract = XmlObjectSerializerWriteContextComplexJson.GetRevisedItemContract (collectionContract.ItemContract);
631 var v = DataContractJsonSerializer.ReadJsonValue (revisedContract, xmlReader, context);
632 return CodeInterpreter.ConvertValue (v, Globals.TypeOfObject, itemType);
635 return ReadValue (itemType, JsonGlobals.itemString);
638 void StoreCollectionValue (object collection, Type valueType, object value, CollectionDataContract collectionContract)
640 if (collectionContract.Kind == CollectionKind.GenericDictionary || collectionContract.Kind == CollectionKind.Dictionary) {
641 ClassDataContract keyValuePairContract = DataContract.GetDataContract (valueType) as ClassDataContract;
642 if (keyValuePairContract == null)
643 Fx.Assert ("Failed to create contract for KeyValuePair type");
644 DataMember keyMember = keyValuePairContract.Members [0];
645 DataMember valueMember = keyValuePairContract.Members [1];
646 object pkey = CodeInterpreter.GetMember (keyMember.MemberInfo, value);
647 object pvalue = CodeInterpreter.GetMember (valueMember.MemberInfo, value);
650 collectionContract.AddMethod.Invoke (collection, new object [] {pkey, pvalue});
651 } catch (TargetInvocationException ex) {
652 if (ex.InnerException != null)
653 throw ex.InnerException;
659 collectionContract.AddMethod.Invoke (collection, new object [] {value});
662 void HandleUnexpectedItemInCollection (ref int iterator)
664 if (IsStartElement ()) {
665 context.SkipUnknownElement (xmlReader);
669 throw XmlObjectSerializerReadContext.CreateUnexpectedStateException (XmlNodeType.Element, xmlReader);
672 bool IsStartElement(XmlDictionaryString name, XmlDictionaryString ns)
674 return xmlReader.IsStartElement (name, ns);
677 bool IsStartElement()
679 return xmlReader.IsStartElement ();
684 return xmlReader.NodeType == XmlNodeType.EndElement;
687 void ThrowUnexpectedStateException (XmlNodeType expectedState)
689 throw XmlObjectSerializerReadContext.CreateUnexpectedStateException (expectedState, xmlReader);
692 void ThrowSerializationException (string msg, params object [] values)
694 if (values != null && values.Length > 0)
695 msg = string.Format (msg, values);
696 throw new SerializationException (msg);