XmlObjectSerializerReadContext.cs 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.Runtime.Serialization
  5. {
  6. using System;
  7. using System.Collections;
  8. using System.Collections.Generic;
  9. using System.Diagnostics;
  10. using System.Runtime.Diagnostics;
  11. using System.ServiceModel.Diagnostics;
  12. using System.Text;
  13. using System.Xml;
  14. using System.Xml.Serialization;
  15. using System.Runtime.Serialization.Diagnostics;
  16. #if USE_REFEMIT
  17. public class XmlObjectSerializerReadContext : XmlObjectSerializerContext
  18. #else
  19. internal class XmlObjectSerializerReadContext : XmlObjectSerializerContext
  20. #endif
  21. {
  22. internal Attributes attributes;
  23. HybridObjectCache deserializedObjects;
  24. XmlSerializableReader xmlSerializableReader;
  25. XmlDocument xmlDocument;
  26. Attributes attributesInXmlData;
  27. XmlReaderDelegator extensionDataReader;
  28. object getOnlyCollectionValue;
  29. bool isGetOnlyCollection;
  30. HybridObjectCache DeserializedObjects
  31. {
  32. get
  33. {
  34. if (deserializedObjects == null)
  35. deserializedObjects = new HybridObjectCache();
  36. return deserializedObjects;
  37. }
  38. }
  39. XmlDocument Document
  40. {
  41. get
  42. {
  43. if (xmlDocument == null)
  44. xmlDocument = new XmlDocument();
  45. return xmlDocument;
  46. }
  47. }
  48. internal override bool IsGetOnlyCollection
  49. {
  50. get { return this.isGetOnlyCollection; }
  51. set { this.isGetOnlyCollection = value; }
  52. }
  53. #if USE_REFEMIT
  54. public object GetCollectionMember()
  55. #else
  56. internal object GetCollectionMember()
  57. #endif
  58. {
  59. return this.getOnlyCollectionValue;
  60. }
  61. #if USE_REFEMIT
  62. public void StoreCollectionMemberInfo(object collectionMember)
  63. #else
  64. internal void StoreCollectionMemberInfo(object collectionMember)
  65. #endif
  66. {
  67. this.getOnlyCollectionValue = collectionMember;
  68. this.isGetOnlyCollection = true;
  69. }
  70. #if USE_REFEMIT
  71. public static void ThrowNullValueReturnedForGetOnlyCollectionException(Type type)
  72. #else
  73. internal static void ThrowNullValueReturnedForGetOnlyCollectionException(Type type)
  74. #endif
  75. {
  76. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.NullValueReturnedForGetOnlyCollection, DataContract.GetClrTypeFullName(type))));
  77. }
  78. #if USE_REFEMIT
  79. public static void ThrowArrayExceededSizeException(int arraySize, Type type)
  80. #else
  81. internal static void ThrowArrayExceededSizeException(int arraySize, Type type)
  82. #endif
  83. {
  84. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.ArrayExceededSize, arraySize, DataContract.GetClrTypeFullName(type))));
  85. }
  86. internal static XmlObjectSerializerReadContext CreateContext(DataContractSerializer serializer, DataContract rootTypeDataContract, DataContractResolver dataContractResolver)
  87. {
  88. return (serializer.PreserveObjectReferences || serializer.DataContractSurrogate != null)
  89. ? new XmlObjectSerializerReadContextComplex(serializer, rootTypeDataContract, dataContractResolver)
  90. : new XmlObjectSerializerReadContext(serializer, rootTypeDataContract, dataContractResolver);
  91. }
  92. internal static XmlObjectSerializerReadContext CreateContext(NetDataContractSerializer serializer)
  93. {
  94. return new XmlObjectSerializerReadContextComplex(serializer);
  95. }
  96. internal XmlObjectSerializerReadContext(XmlObjectSerializer serializer, int maxItemsInObjectGraph, StreamingContext streamingContext, bool ignoreExtensionDataObject)
  97. : base(serializer, maxItemsInObjectGraph, streamingContext, ignoreExtensionDataObject)
  98. {
  99. }
  100. internal XmlObjectSerializerReadContext(DataContractSerializer serializer, DataContract rootTypeDataContract, DataContractResolver dataContractResolver)
  101. : base(serializer, rootTypeDataContract, dataContractResolver)
  102. {
  103. this.attributes = new Attributes();
  104. }
  105. protected XmlObjectSerializerReadContext(NetDataContractSerializer serializer)
  106. : base(serializer)
  107. {
  108. this.attributes = new Attributes();
  109. }
  110. public virtual object InternalDeserialize(XmlReaderDelegator xmlReader, int id, RuntimeTypeHandle declaredTypeHandle, string name, string ns)
  111. {
  112. DataContract dataContract = GetDataContract(id, declaredTypeHandle);
  113. return InternalDeserialize(xmlReader, name, ns, Type.GetTypeFromHandle(declaredTypeHandle), ref dataContract);
  114. }
  115. internal virtual object InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, string name, string ns)
  116. {
  117. DataContract dataContract = GetDataContract(declaredType);
  118. return InternalDeserialize(xmlReader, name, ns, declaredType, ref dataContract);
  119. }
  120. internal virtual object InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, string name, string ns)
  121. {
  122. if (dataContract == null)
  123. GetDataContract(declaredType);
  124. return InternalDeserialize(xmlReader, name, ns, declaredType, ref dataContract);
  125. }
  126. protected bool TryHandleNullOrRef(XmlReaderDelegator reader, Type declaredType, string name, string ns, ref object retObj)
  127. {
  128. ReadAttributes(reader);
  129. if (attributes.Ref != Globals.NewObjectId)
  130. {
  131. if (this.isGetOnlyCollection)
  132. {
  133. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.IsReferenceGetOnlyCollectionsNotSupported, attributes.Ref, DataContract.GetClrTypeFullName(declaredType))));
  134. }
  135. else
  136. {
  137. retObj = GetExistingObject(attributes.Ref, declaredType, name, ns);
  138. reader.Skip();
  139. return true;
  140. }
  141. }
  142. else if (attributes.XsiNil)
  143. {
  144. reader.Skip();
  145. return true;
  146. }
  147. return false;
  148. }
  149. protected object InternalDeserialize(XmlReaderDelegator reader, string name, string ns, Type declaredType, ref DataContract dataContract)
  150. {
  151. object retObj = null;
  152. if (TryHandleNullOrRef(reader, dataContract.UnderlyingType, name, ns, ref retObj))
  153. return retObj;
  154. bool knownTypesAddedInCurrentScope = false;
  155. if (dataContract.KnownDataContracts != null)
  156. {
  157. scopedKnownTypes.Push(dataContract.KnownDataContracts);
  158. knownTypesAddedInCurrentScope = true;
  159. }
  160. if (attributes.XsiTypeName != null)
  161. {
  162. dataContract = ResolveDataContractFromKnownTypes(attributes.XsiTypeName, attributes.XsiTypeNamespace, dataContract, declaredType);
  163. if (dataContract == null)
  164. {
  165. if (DataContractResolver == null)
  166. {
  167. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(XmlObjectSerializer.TryAddLineInfo(reader, SR.GetString(SR.DcTypeNotFoundOnDeserialize, attributes.XsiTypeNamespace, attributes.XsiTypeName, reader.NamespaceURI, reader.LocalName))));
  168. }
  169. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(XmlObjectSerializer.TryAddLineInfo(reader, SR.GetString(SR.DcTypeNotResolvedOnDeserialize, attributes.XsiTypeNamespace, attributes.XsiTypeName, reader.NamespaceURI, reader.LocalName))));
  170. }
  171. knownTypesAddedInCurrentScope = ReplaceScopedKnownTypesTop(dataContract.KnownDataContracts, knownTypesAddedInCurrentScope);
  172. }
  173. if (dataContract.IsISerializable && attributes.FactoryTypeName != null)
  174. {
  175. DataContract factoryDataContract = ResolveDataContractFromKnownTypes(attributes.FactoryTypeName, attributes.FactoryTypeNamespace, dataContract, declaredType);
  176. if (factoryDataContract != null)
  177. {
  178. if (factoryDataContract.IsISerializable)
  179. {
  180. dataContract = factoryDataContract;
  181. knownTypesAddedInCurrentScope = ReplaceScopedKnownTypesTop(dataContract.KnownDataContracts, knownTypesAddedInCurrentScope);
  182. }
  183. else
  184. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.FactoryTypeNotISerializable, DataContract.GetClrTypeFullName(factoryDataContract.UnderlyingType), DataContract.GetClrTypeFullName(dataContract.UnderlyingType))));
  185. }
  186. else
  187. {
  188. if (DiagnosticUtility.ShouldTraceWarning)
  189. {
  190. Dictionary<string, string> values = new Dictionary<string, string>(2);
  191. values["FactoryType"] = attributes.FactoryTypeNamespace + ":" + attributes.FactoryTypeName;
  192. values["ISerializableType"] = dataContract.StableName.Namespace + ":" + dataContract.StableName.Name;
  193. TraceUtility.Trace(TraceEventType.Warning, TraceCode.FactoryTypeNotFound,
  194. SR.GetString(SR.TraceCodeFactoryTypeNotFound), new DictionaryTraceRecord(values));
  195. }
  196. }
  197. }
  198. if (knownTypesAddedInCurrentScope)
  199. {
  200. object obj = ReadDataContractValue(dataContract, reader);
  201. scopedKnownTypes.Pop();
  202. return obj;
  203. }
  204. else
  205. {
  206. return ReadDataContractValue(dataContract, reader);
  207. }
  208. }
  209. bool ReplaceScopedKnownTypesTop(Dictionary<XmlQualifiedName, DataContract> knownDataContracts, bool knownTypesAddedInCurrentScope)
  210. {
  211. if (knownTypesAddedInCurrentScope)
  212. {
  213. scopedKnownTypes.Pop();
  214. knownTypesAddedInCurrentScope = false;
  215. }
  216. if (knownDataContracts != null)
  217. {
  218. scopedKnownTypes.Push(knownDataContracts);
  219. knownTypesAddedInCurrentScope = true;
  220. }
  221. return knownTypesAddedInCurrentScope;
  222. }
  223. public static bool MoveToNextElement(XmlReaderDelegator xmlReader)
  224. {
  225. return (xmlReader.MoveToContent() != XmlNodeType.EndElement);
  226. }
  227. public int GetMemberIndex(XmlReaderDelegator xmlReader, XmlDictionaryString[] memberNames, XmlDictionaryString[] memberNamespaces, int memberIndex, ExtensionDataObject extensionData)
  228. {
  229. for (int i = memberIndex + 1; i < memberNames.Length; i++)
  230. {
  231. if (xmlReader.IsStartElement(memberNames[i], memberNamespaces[i]))
  232. return i;
  233. }
  234. HandleMemberNotFound(xmlReader, extensionData, memberIndex);
  235. return memberNames.Length;
  236. }
  237. public int GetMemberIndexWithRequiredMembers(XmlReaderDelegator xmlReader, XmlDictionaryString[] memberNames, XmlDictionaryString[] memberNamespaces, int memberIndex, int requiredIndex, ExtensionDataObject extensionData)
  238. {
  239. for (int i = memberIndex + 1; i < memberNames.Length; i++)
  240. {
  241. if (xmlReader.IsStartElement(memberNames[i], memberNamespaces[i]))
  242. {
  243. if (requiredIndex < i)
  244. ThrowRequiredMemberMissingException(xmlReader, memberIndex, requiredIndex, memberNames);
  245. return i;
  246. }
  247. }
  248. HandleMemberNotFound(xmlReader, extensionData, memberIndex);
  249. return memberNames.Length;
  250. }
  251. public static void ThrowRequiredMemberMissingException(XmlReaderDelegator xmlReader, int memberIndex, int requiredIndex, XmlDictionaryString[] memberNames)
  252. {
  253. StringBuilder stringBuilder = new StringBuilder();
  254. if (requiredIndex == memberNames.Length)
  255. requiredIndex--;
  256. for (int i = memberIndex + 1; i <= requiredIndex; i++)
  257. {
  258. if (stringBuilder.Length != 0)
  259. stringBuilder.Append(" | ");
  260. stringBuilder.Append(memberNames[i].Value);
  261. }
  262. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(XmlObjectSerializer.TryAddLineInfo(xmlReader, SR.GetString(SR.UnexpectedElementExpectingElements, xmlReader.NodeType, xmlReader.LocalName, xmlReader.NamespaceURI, stringBuilder.ToString()))));
  263. }
  264. protected void HandleMemberNotFound(XmlReaderDelegator xmlReader, ExtensionDataObject extensionData, int memberIndex)
  265. {
  266. xmlReader.MoveToContent();
  267. if (xmlReader.NodeType != XmlNodeType.Element)
  268. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateUnexpectedStateException(XmlNodeType.Element, xmlReader));
  269. if (IgnoreExtensionDataObject || extensionData == null)
  270. SkipUnknownElement(xmlReader);
  271. else
  272. HandleUnknownElement(xmlReader, extensionData, memberIndex);
  273. }
  274. internal void HandleUnknownElement(XmlReaderDelegator xmlReader, ExtensionDataObject extensionData, int memberIndex)
  275. {
  276. if (extensionData.Members == null)
  277. extensionData.Members = new List<ExtensionDataMember>();
  278. extensionData.Members.Add(ReadExtensionDataMember(xmlReader, memberIndex));
  279. }
  280. public void SkipUnknownElement(XmlReaderDelegator xmlReader)
  281. {
  282. ReadAttributes(xmlReader);
  283. if (DiagnosticUtility.ShouldTraceVerbose)
  284. {
  285. TraceUtility.Trace(TraceEventType.Verbose, TraceCode.ElementIgnored,
  286. SR.GetString(SR.TraceCodeElementIgnored), new StringTraceRecord("Element", xmlReader.NamespaceURI + ":" + xmlReader.LocalName));
  287. }
  288. xmlReader.Skip();
  289. }
  290. public string ReadIfNullOrRef(XmlReaderDelegator xmlReader, Type memberType, bool isMemberTypeSerializable)
  291. {
  292. if (attributes.Ref != Globals.NewObjectId)
  293. {
  294. CheckIfTypeSerializable(memberType, isMemberTypeSerializable);
  295. xmlReader.Skip();
  296. return attributes.Ref;
  297. }
  298. else if (attributes.XsiNil)
  299. {
  300. CheckIfTypeSerializable(memberType, isMemberTypeSerializable);
  301. xmlReader.Skip();
  302. return Globals.NullObjectId;
  303. }
  304. return Globals.NewObjectId;
  305. }
  306. #if USE_REFEMIT
  307. public virtual void ReadAttributes(XmlReaderDelegator xmlReader)
  308. #else
  309. internal virtual void ReadAttributes(XmlReaderDelegator xmlReader)
  310. #endif
  311. {
  312. if (attributes == null)
  313. attributes = new Attributes();
  314. attributes.Read(xmlReader);
  315. }
  316. public void ResetAttributes()
  317. {
  318. if (attributes != null)
  319. attributes.Reset();
  320. }
  321. public string GetObjectId()
  322. {
  323. return attributes.Id;
  324. }
  325. #if USE_REFEMIT
  326. public virtual int GetArraySize()
  327. #else
  328. internal virtual int GetArraySize()
  329. #endif
  330. {
  331. return -1;
  332. }
  333. public void AddNewObject(object obj)
  334. {
  335. AddNewObjectWithId(attributes.Id, obj);
  336. }
  337. public void AddNewObjectWithId(string id, object obj)
  338. {
  339. if (id != Globals.NewObjectId)
  340. DeserializedObjects.Add(id, obj);
  341. if (extensionDataReader != null)
  342. extensionDataReader.UnderlyingExtensionDataReader.SetDeserializedValue(obj);
  343. }
  344. public void ReplaceDeserializedObject(string id, object oldObj, object newObj)
  345. {
  346. if (object.ReferenceEquals(oldObj, newObj))
  347. return;
  348. if (id != Globals.NewObjectId)
  349. {
  350. // In certain cases (IObjectReference, SerializationSurrogate or DataContractSurrogate),
  351. // an object can be replaced with a different object once it is deserialized. If the
  352. // object happens to be referenced from within itself, that reference needs to be updated
  353. // with the new instance. BinaryFormatter supports this by fixing up such references later.
  354. // These XmlObjectSerializer implementations do not currently support fix-ups. Hence we
  355. // throw in such cases to allow us add fix-up support in the future if we need to.
  356. if (DeserializedObjects.IsObjectReferenced(id))
  357. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.FactoryObjectContainsSelfReference, DataContract.GetClrTypeFullName(oldObj.GetType()), DataContract.GetClrTypeFullName(newObj.GetType()), id)));
  358. DeserializedObjects.Remove(id);
  359. DeserializedObjects.Add(id, newObj);
  360. }
  361. if (extensionDataReader != null)
  362. extensionDataReader.UnderlyingExtensionDataReader.SetDeserializedValue(newObj);
  363. }
  364. public object GetExistingObject(string id, Type type, string name, string ns)
  365. {
  366. object retObj = DeserializedObjects.GetObject(id);
  367. if (retObj == null)
  368. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.DeserializedObjectWithIdNotFound, id)));
  369. if (retObj is IDataNode)
  370. {
  371. IDataNode dataNode = (IDataNode)retObj;
  372. retObj = (dataNode.Value != null && dataNode.IsFinalValue) ? dataNode.Value : DeserializeFromExtensionData(dataNode, type, name, ns);
  373. }
  374. return retObj;
  375. }
  376. object GetExistingObjectOrExtensionData(string id)
  377. {
  378. object retObj = DeserializedObjects.GetObject(id);
  379. if (retObj == null)
  380. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.DeserializedObjectWithIdNotFound, id)));
  381. return retObj;
  382. }
  383. public object GetRealObject(IObjectReference obj, string id)
  384. {
  385. object realObj = SurrogateDataContract.GetRealObject(obj, this.GetStreamingContext());
  386. // If GetRealObject returns null, it indicates that the object could not resolve itself because
  387. // it is missing information. This may occur in a case where multiple IObjectReference instances
  388. // depend on each other. BinaryFormatter supports this by fixing up the references later. These
  389. // XmlObjectSerializer implementations do not support fix-ups since the format does not contain
  390. // forward references. However, we throw for this case since it allows us to add fix-up support
  391. // in the future if we need to.
  392. if (realObj == null)
  393. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.GetRealObjectReturnedNull, DataContract.GetClrTypeFullName(obj.GetType()))));
  394. ReplaceDeserializedObject(id, obj, realObj);
  395. return realObj;
  396. }
  397. object DeserializeFromExtensionData(IDataNode dataNode, Type type, string name, string ns)
  398. {
  399. ExtensionDataReader underlyingExtensionDataReader;
  400. if (extensionDataReader == null)
  401. {
  402. underlyingExtensionDataReader = new ExtensionDataReader(this);
  403. extensionDataReader = CreateReaderDelegatorForReader(underlyingExtensionDataReader);
  404. }
  405. else
  406. underlyingExtensionDataReader = extensionDataReader.UnderlyingExtensionDataReader;
  407. underlyingExtensionDataReader.SetDataNode(dataNode, name, ns);
  408. object retObj = InternalDeserialize(extensionDataReader, type, name, ns);
  409. dataNode.Clear();
  410. underlyingExtensionDataReader.Reset();
  411. return retObj;
  412. }
  413. public static void Read(XmlReaderDelegator xmlReader)
  414. {
  415. if (!xmlReader.Read())
  416. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.UnexpectedEndOfFile)));
  417. }
  418. internal static void ParseQualifiedName(string qname, XmlReaderDelegator xmlReader, out string name, out string ns, out string prefix)
  419. {
  420. int colon = qname.IndexOf(':');
  421. prefix = "";
  422. if (colon >= 0)
  423. prefix = qname.Substring(0, colon);
  424. name = qname.Substring(colon + 1);
  425. ns = xmlReader.LookupNamespace(prefix);
  426. }
  427. public static T[] EnsureArraySize<T>(T[] array, int index)
  428. {
  429. if (array.Length <= index)
  430. {
  431. if (index == Int32.MaxValue)
  432. {
  433. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
  434. XmlObjectSerializer.CreateSerializationException(
  435. SR.GetString(SR.MaxArrayLengthExceeded, Int32.MaxValue,
  436. DataContract.GetClrTypeFullName(typeof(T)))));
  437. }
  438. int newSize = (index < Int32.MaxValue / 2) ? index * 2 : Int32.MaxValue;
  439. T[] newArray = new T[newSize];
  440. Array.Copy(array, 0, newArray, 0, array.Length);
  441. array = newArray;
  442. }
  443. return array;
  444. }
  445. public static T[] TrimArraySize<T>(T[] array, int size)
  446. {
  447. if (size != array.Length)
  448. {
  449. T[] newArray = new T[size];
  450. Array.Copy(array, 0, newArray, 0, size);
  451. array = newArray;
  452. }
  453. return array;
  454. }
  455. public void CheckEndOfArray(XmlReaderDelegator xmlReader, int arraySize, XmlDictionaryString itemName, XmlDictionaryString itemNamespace)
  456. {
  457. if (xmlReader.NodeType == XmlNodeType.EndElement)
  458. return;
  459. while (xmlReader.IsStartElement())
  460. {
  461. if (xmlReader.IsStartElement(itemName, itemNamespace))
  462. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.ArrayExceededSizeAttribute, arraySize, itemName.Value, itemNamespace.Value)));
  463. SkipUnknownElement(xmlReader);
  464. }
  465. if (xmlReader.NodeType != XmlNodeType.EndElement)
  466. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateUnexpectedStateException(XmlNodeType.EndElement, xmlReader));
  467. }
  468. internal object ReadIXmlSerializable(XmlReaderDelegator xmlReader, XmlDataContract xmlDataContract, bool isMemberType)
  469. {
  470. if (xmlSerializableReader == null)
  471. xmlSerializableReader = new XmlSerializableReader();
  472. return ReadIXmlSerializable(xmlSerializableReader, xmlReader, xmlDataContract, isMemberType);
  473. }
  474. internal static object ReadRootIXmlSerializable(XmlReaderDelegator xmlReader, XmlDataContract xmlDataContract, bool isMemberType)
  475. {
  476. return ReadIXmlSerializable(new XmlSerializableReader(), xmlReader, xmlDataContract, isMemberType);
  477. }
  478. internal static object ReadIXmlSerializable(XmlSerializableReader xmlSerializableReader, XmlReaderDelegator xmlReader, XmlDataContract xmlDataContract, bool isMemberType)
  479. {
  480. object obj = null;
  481. xmlSerializableReader.BeginRead(xmlReader);
  482. if (isMemberType && !xmlDataContract.HasRoot)
  483. {
  484. xmlReader.Read();
  485. xmlReader.MoveToContent();
  486. }
  487. if (xmlDataContract.UnderlyingType == Globals.TypeOfXmlElement)
  488. {
  489. if (!xmlReader.IsStartElement())
  490. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateUnexpectedStateException(XmlNodeType.Element, xmlReader));
  491. XmlDocument xmlDoc = new XmlDocument();
  492. obj = (XmlElement)xmlDoc.ReadNode(xmlSerializableReader);
  493. }
  494. else if (xmlDataContract.UnderlyingType == Globals.TypeOfXmlNodeArray)
  495. {
  496. obj = XmlSerializableServices.ReadNodes(xmlSerializableReader);
  497. }
  498. else
  499. {
  500. IXmlSerializable xmlSerializable = xmlDataContract.CreateXmlSerializableDelegate();
  501. xmlSerializable.ReadXml(xmlSerializableReader);
  502. obj = xmlSerializable;
  503. }
  504. xmlSerializableReader.EndRead();
  505. return obj;
  506. }
  507. public SerializationInfo ReadSerializationInfo(XmlReaderDelegator xmlReader, Type type)
  508. {
  509. SerializationInfo serInfo = new SerializationInfo(type, XmlObjectSerializer.FormatterConverter);
  510. XmlNodeType nodeType;
  511. while ((nodeType = xmlReader.MoveToContent()) != XmlNodeType.EndElement)
  512. {
  513. if (nodeType != XmlNodeType.Element)
  514. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateUnexpectedStateException(XmlNodeType.Element, xmlReader));
  515. if (xmlReader.NamespaceURI.Length != 0)
  516. {
  517. SkipUnknownElement(xmlReader);
  518. continue;
  519. }
  520. string name = XmlConvert.DecodeName(xmlReader.LocalName);
  521. IncrementItemCount(1);
  522. ReadAttributes(xmlReader);
  523. object value;
  524. if (attributes.Ref != Globals.NewObjectId)
  525. {
  526. xmlReader.Skip();
  527. value = GetExistingObject(attributes.Ref, null, name, String.Empty);
  528. }
  529. else if (attributes.XsiNil)
  530. {
  531. xmlReader.Skip();
  532. value = null;
  533. }
  534. else
  535. {
  536. value = InternalDeserialize(xmlReader, Globals.TypeOfObject, name, String.Empty);
  537. }
  538. serInfo.AddValue(name, value);
  539. }
  540. return serInfo;
  541. }
  542. protected virtual DataContract ResolveDataContractFromTypeName()
  543. {
  544. return (attributes.XsiTypeName == null) ? null : ResolveDataContractFromKnownTypes(attributes.XsiTypeName, attributes.XsiTypeNamespace, null /*memberTypeContract*/, null);
  545. }
  546. ExtensionDataMember ReadExtensionDataMember(XmlReaderDelegator xmlReader, int memberIndex)
  547. {
  548. ExtensionDataMember member = new ExtensionDataMember();
  549. member.Name = xmlReader.LocalName;
  550. member.Namespace = xmlReader.NamespaceURI;
  551. member.MemberIndex = memberIndex;
  552. if (xmlReader.UnderlyingExtensionDataReader != null)
  553. {
  554. // no need to re-read extension data structure
  555. member.Value = xmlReader.UnderlyingExtensionDataReader.GetCurrentNode();
  556. }
  557. else
  558. member.Value = ReadExtensionDataValue(xmlReader);
  559. return member;
  560. }
  561. public IDataNode ReadExtensionDataValue(XmlReaderDelegator xmlReader)
  562. {
  563. ReadAttributes(xmlReader);
  564. IncrementItemCount(1);
  565. IDataNode dataNode = null;
  566. if (attributes.Ref != Globals.NewObjectId)
  567. {
  568. xmlReader.Skip();
  569. object o = GetExistingObjectOrExtensionData(attributes.Ref);
  570. dataNode = (o is IDataNode) ? (IDataNode)o : new DataNode<object>(o);
  571. dataNode.Id = attributes.Ref;
  572. }
  573. else if (attributes.XsiNil)
  574. {
  575. xmlReader.Skip();
  576. dataNode = null;
  577. }
  578. else
  579. {
  580. string dataContractName = null;
  581. string dataContractNamespace = null;
  582. if (attributes.XsiTypeName != null)
  583. {
  584. dataContractName = attributes.XsiTypeName;
  585. dataContractNamespace = attributes.XsiTypeNamespace;
  586. }
  587. if (IsReadingCollectionExtensionData(xmlReader))
  588. {
  589. Read(xmlReader);
  590. dataNode = ReadUnknownCollectionData(xmlReader, dataContractName, dataContractNamespace);
  591. }
  592. else if (attributes.FactoryTypeName != null)
  593. {
  594. Read(xmlReader);
  595. dataNode = ReadUnknownISerializableData(xmlReader, dataContractName, dataContractNamespace);
  596. }
  597. else if (IsReadingClassExtensionData(xmlReader))
  598. {
  599. Read(xmlReader);
  600. dataNode = ReadUnknownClassData(xmlReader, dataContractName, dataContractNamespace);
  601. }
  602. else
  603. {
  604. DataContract dataContract = ResolveDataContractFromTypeName();
  605. if (dataContract == null)
  606. dataNode = ReadExtensionDataValue(xmlReader, dataContractName, dataContractNamespace);
  607. else if (dataContract is XmlDataContract)
  608. dataNode = ReadUnknownXmlData(xmlReader, dataContractName, dataContractNamespace);
  609. else
  610. {
  611. if (dataContract.IsISerializable)
  612. {
  613. Read(xmlReader);
  614. dataNode = ReadUnknownISerializableData(xmlReader, dataContractName, dataContractNamespace);
  615. }
  616. else if (dataContract is PrimitiveDataContract)
  617. {
  618. if (attributes.Id == Globals.NewObjectId)
  619. {
  620. Read(xmlReader);
  621. xmlReader.MoveToContent();
  622. dataNode = ReadUnknownPrimitiveData(xmlReader, dataContract.UnderlyingType, dataContractName, dataContractNamespace);
  623. xmlReader.ReadEndElement();
  624. }
  625. else
  626. {
  627. dataNode = new DataNode<object>(xmlReader.ReadElementContentAsAnyType(dataContract.UnderlyingType));
  628. InitializeExtensionDataNode(dataNode, dataContractName, dataContractNamespace);
  629. }
  630. }
  631. else if (dataContract is EnumDataContract)
  632. {
  633. dataNode = new DataNode<object>(((EnumDataContract)dataContract).ReadEnumValue(xmlReader));
  634. InitializeExtensionDataNode(dataNode, dataContractName, dataContractNamespace);
  635. }
  636. else if (dataContract is ClassDataContract)
  637. {
  638. Read(xmlReader);
  639. dataNode = ReadUnknownClassData(xmlReader, dataContractName, dataContractNamespace);
  640. }
  641. else if (dataContract is CollectionDataContract)
  642. {
  643. Read(xmlReader);
  644. dataNode = ReadUnknownCollectionData(xmlReader, dataContractName, dataContractNamespace);
  645. }
  646. }
  647. }
  648. }
  649. return dataNode;
  650. }
  651. protected virtual void StartReadExtensionDataValue(XmlReaderDelegator xmlReader)
  652. {
  653. }
  654. IDataNode ReadExtensionDataValue(XmlReaderDelegator xmlReader, string dataContractName, string dataContractNamespace)
  655. {
  656. StartReadExtensionDataValue(xmlReader);
  657. if (attributes.UnrecognizedAttributesFound)
  658. return ReadUnknownXmlData(xmlReader, dataContractName, dataContractNamespace);
  659. IDictionary<string, string> namespacesInScope = xmlReader.GetNamespacesInScope(XmlNamespaceScope.ExcludeXml);
  660. Read(xmlReader);
  661. xmlReader.MoveToContent();
  662. switch (xmlReader.NodeType)
  663. {
  664. case XmlNodeType.Text:
  665. return ReadPrimitiveExtensionDataValue(xmlReader, dataContractName, dataContractNamespace);
  666. case XmlNodeType.Element:
  667. if (xmlReader.NamespaceURI.StartsWith(Globals.DataContractXsdBaseNamespace, StringComparison.Ordinal))
  668. return ReadUnknownClassData(xmlReader, dataContractName, dataContractNamespace);
  669. else
  670. return ReadAndResolveUnknownXmlData(xmlReader, namespacesInScope, dataContractName, dataContractNamespace);
  671. case XmlNodeType.EndElement:
  672. {
  673. // NOTE: cannot distinguish between empty class or IXmlSerializable and typeof(object)
  674. IDataNode objNode = ReadUnknownPrimitiveData(xmlReader, Globals.TypeOfObject, dataContractName, dataContractNamespace);
  675. xmlReader.ReadEndElement();
  676. objNode.IsFinalValue = false;
  677. return objNode;
  678. }
  679. default:
  680. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateUnexpectedStateException(XmlNodeType.Element, xmlReader));
  681. }
  682. }
  683. protected virtual IDataNode ReadPrimitiveExtensionDataValue(XmlReaderDelegator xmlReader, string dataContractName, string dataContractNamespace)
  684. {
  685. Type valueType = xmlReader.ValueType;
  686. if (valueType == Globals.TypeOfString)
  687. {
  688. // NOTE: cannot distinguish other primitives from string (default XmlReader ValueType)
  689. IDataNode stringNode = new DataNode<object>(xmlReader.ReadContentAsString());
  690. InitializeExtensionDataNode(stringNode, dataContractName, dataContractNamespace);
  691. stringNode.IsFinalValue = false;
  692. xmlReader.ReadEndElement();
  693. return stringNode;
  694. }
  695. else
  696. {
  697. IDataNode objNode = ReadUnknownPrimitiveData(xmlReader, valueType, dataContractName, dataContractNamespace);
  698. xmlReader.ReadEndElement();
  699. return objNode;
  700. }
  701. }
  702. protected void InitializeExtensionDataNode(IDataNode dataNode, string dataContractName, string dataContractNamespace)
  703. {
  704. dataNode.DataContractName = dataContractName;
  705. dataNode.DataContractNamespace = dataContractNamespace;
  706. dataNode.ClrAssemblyName = attributes.ClrAssembly;
  707. dataNode.ClrTypeName = attributes.ClrType;
  708. AddNewObject(dataNode);
  709. dataNode.Id = attributes.Id;
  710. }
  711. IDataNode ReadUnknownPrimitiveData(XmlReaderDelegator xmlReader, Type type, string dataContractName, string dataContractNamespace)
  712. {
  713. IDataNode dataNode = xmlReader.ReadExtensionData(type);
  714. InitializeExtensionDataNode(dataNode, dataContractName, dataContractNamespace);
  715. return dataNode;
  716. }
  717. ClassDataNode ReadUnknownClassData(XmlReaderDelegator xmlReader, string dataContractName, string dataContractNamespace)
  718. {
  719. ClassDataNode dataNode = new ClassDataNode();
  720. InitializeExtensionDataNode(dataNode, dataContractName, dataContractNamespace);
  721. int memberIndex = 0;
  722. XmlNodeType nodeType;
  723. while ((nodeType = xmlReader.MoveToContent()) != XmlNodeType.EndElement)
  724. {
  725. if (nodeType != XmlNodeType.Element)
  726. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateUnexpectedStateException(XmlNodeType.Element, xmlReader));
  727. if (dataNode.Members == null)
  728. dataNode.Members = new List<ExtensionDataMember>();
  729. dataNode.Members.Add(ReadExtensionDataMember(xmlReader, memberIndex++));
  730. }
  731. xmlReader.ReadEndElement();
  732. return dataNode;
  733. }
  734. CollectionDataNode ReadUnknownCollectionData(XmlReaderDelegator xmlReader, string dataContractName, string dataContractNamespace)
  735. {
  736. CollectionDataNode dataNode = new CollectionDataNode();
  737. InitializeExtensionDataNode(dataNode, dataContractName, dataContractNamespace);
  738. int arraySize = attributes.ArraySZSize;
  739. XmlNodeType nodeType;
  740. while ((nodeType = xmlReader.MoveToContent()) != XmlNodeType.EndElement)
  741. {
  742. if (nodeType != XmlNodeType.Element)
  743. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateUnexpectedStateException(XmlNodeType.Element, xmlReader));
  744. if (dataNode.ItemName == null)
  745. {
  746. dataNode.ItemName = xmlReader.LocalName;
  747. dataNode.ItemNamespace = xmlReader.NamespaceURI;
  748. }
  749. if (xmlReader.IsStartElement(dataNode.ItemName, dataNode.ItemNamespace))
  750. {
  751. if (dataNode.Items == null)
  752. dataNode.Items = new List<IDataNode>();
  753. dataNode.Items.Add(ReadExtensionDataValue(xmlReader));
  754. }
  755. else
  756. SkipUnknownElement(xmlReader);
  757. }
  758. xmlReader.ReadEndElement();
  759. if (arraySize != -1)
  760. {
  761. dataNode.Size = arraySize;
  762. if (dataNode.Items == null)
  763. {
  764. if (dataNode.Size > 0)
  765. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.ArraySizeAttributeIncorrect, arraySize, 0)));
  766. }
  767. else if (dataNode.Size != dataNode.Items.Count)
  768. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.ArraySizeAttributeIncorrect, arraySize, dataNode.Items.Count)));
  769. }
  770. else
  771. {
  772. if (dataNode.Items != null)
  773. {
  774. dataNode.Size = dataNode.Items.Count;
  775. }
  776. else
  777. {
  778. dataNode.Size = 0;
  779. }
  780. }
  781. return dataNode;
  782. }
  783. ISerializableDataNode ReadUnknownISerializableData(XmlReaderDelegator xmlReader, string dataContractName, string dataContractNamespace)
  784. {
  785. ISerializableDataNode dataNode = new ISerializableDataNode();
  786. InitializeExtensionDataNode(dataNode, dataContractName, dataContractNamespace);
  787. dataNode.FactoryTypeName = attributes.FactoryTypeName;
  788. dataNode.FactoryTypeNamespace = attributes.FactoryTypeNamespace;
  789. XmlNodeType nodeType;
  790. while ((nodeType = xmlReader.MoveToContent()) != XmlNodeType.EndElement)
  791. {
  792. if (nodeType != XmlNodeType.Element)
  793. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateUnexpectedStateException(XmlNodeType.Element, xmlReader));
  794. if (xmlReader.NamespaceURI.Length != 0)
  795. {
  796. SkipUnknownElement(xmlReader);
  797. continue;
  798. }
  799. ISerializableDataMember member = new ISerializableDataMember();
  800. member.Name = xmlReader.LocalName;
  801. member.Value = ReadExtensionDataValue(xmlReader);
  802. if (dataNode.Members == null)
  803. dataNode.Members = new List<ISerializableDataMember>();
  804. dataNode.Members.Add(member);
  805. }
  806. xmlReader.ReadEndElement();
  807. return dataNode;
  808. }
  809. IDataNode ReadUnknownXmlData(XmlReaderDelegator xmlReader, string dataContractName, string dataContractNamespace)
  810. {
  811. XmlDataNode dataNode = new XmlDataNode();
  812. InitializeExtensionDataNode(dataNode, dataContractName, dataContractNamespace);
  813. dataNode.OwnerDocument = Document;
  814. if (xmlReader.NodeType == XmlNodeType.EndElement)
  815. return dataNode;
  816. IList<XmlAttribute> xmlAttributes = null;
  817. IList<XmlNode> xmlChildNodes = null;
  818. XmlNodeType nodeType = xmlReader.MoveToContent();
  819. if (nodeType != XmlNodeType.Text)
  820. {
  821. while (xmlReader.MoveToNextAttribute())
  822. {
  823. string ns = xmlReader.NamespaceURI;
  824. if (ns != Globals.SerializationNamespace && ns != Globals.SchemaInstanceNamespace)
  825. {
  826. if (xmlAttributes == null)
  827. xmlAttributes = new List<XmlAttribute>();
  828. xmlAttributes.Add((XmlAttribute)Document.ReadNode(xmlReader.UnderlyingReader));
  829. }
  830. }
  831. Read(xmlReader);
  832. }
  833. while ((nodeType = xmlReader.MoveToContent()) != XmlNodeType.EndElement)
  834. {
  835. if (xmlReader.EOF)
  836. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.UnexpectedEndOfFile)));
  837. if (xmlChildNodes == null)
  838. xmlChildNodes = new List<XmlNode>();
  839. xmlChildNodes.Add(Document.ReadNode(xmlReader.UnderlyingReader));
  840. }
  841. xmlReader.ReadEndElement();
  842. dataNode.XmlAttributes = xmlAttributes;
  843. dataNode.XmlChildNodes = xmlChildNodes;
  844. return dataNode;
  845. }
  846. // Pattern-recognition logic: the method reads XML elements into DOM. To recognize as an array, it requires that
  847. // all items have the same name and namespace. To recognize as an ISerializable type, it requires that all
  848. // items be unqualified. If the XML only contains elements (no attributes or other nodes) is recognized as a
  849. // class/class hierarchy. Otherwise it is deserialized as XML.
  850. IDataNode ReadAndResolveUnknownXmlData(XmlReaderDelegator xmlReader, IDictionary<string, string> namespaces,
  851. string dataContractName, string dataContractNamespace)
  852. {
  853. bool couldBeISerializableData = true;
  854. bool couldBeCollectionData = true;
  855. bool couldBeClassData = true;
  856. string elementNs = null, elementName = null;
  857. IList<XmlNode> xmlChildNodes = new List<XmlNode>();
  858. IList<XmlAttribute> xmlAttributes = null;
  859. if (namespaces != null)
  860. {
  861. xmlAttributes = new List<XmlAttribute>();
  862. foreach (KeyValuePair<string, string> prefixNsPair in namespaces)
  863. {
  864. xmlAttributes.Add(AddNamespaceDeclaration(prefixNsPair.Key, prefixNsPair.Value));
  865. }
  866. }
  867. XmlNodeType nodeType;
  868. while ((nodeType = xmlReader.NodeType) != XmlNodeType.EndElement)
  869. {
  870. if (nodeType == XmlNodeType.Element)
  871. {
  872. string ns = xmlReader.NamespaceURI;
  873. string name = xmlReader.LocalName;
  874. if (couldBeISerializableData)
  875. couldBeISerializableData = (ns.Length == 0);
  876. if (couldBeCollectionData)
  877. {
  878. if (elementName == null)
  879. {
  880. elementName = name;
  881. elementNs = ns;
  882. }
  883. else
  884. couldBeCollectionData = (String.CompareOrdinal(elementName, name) == 0) &&
  885. (String.CompareOrdinal(elementNs, ns) == 0);
  886. }
  887. }
  888. else if (xmlReader.EOF)
  889. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.UnexpectedEndOfFile)));
  890. else if (IsContentNode(xmlReader.NodeType))
  891. couldBeClassData = couldBeISerializableData = couldBeCollectionData = false;
  892. if (attributesInXmlData == null) attributesInXmlData = new Attributes();
  893. attributesInXmlData.Read(xmlReader);
  894. XmlNode childNode = Document.ReadNode(xmlReader.UnderlyingReader);
  895. xmlChildNodes.Add(childNode);
  896. if (namespaces == null)
  897. {
  898. if (attributesInXmlData.XsiTypeName != null)
  899. childNode.Attributes.Append(AddNamespaceDeclaration(attributesInXmlData.XsiTypePrefix, attributesInXmlData.XsiTypeNamespace));
  900. if (attributesInXmlData.FactoryTypeName != null)
  901. childNode.Attributes.Append(AddNamespaceDeclaration(attributesInXmlData.FactoryTypePrefix, attributesInXmlData.FactoryTypeNamespace));
  902. }
  903. }
  904. xmlReader.ReadEndElement();
  905. if (elementName != null && couldBeCollectionData)
  906. return ReadUnknownCollectionData(CreateReaderOverChildNodes(xmlAttributes, xmlChildNodes), dataContractName, dataContractNamespace);
  907. else if (couldBeISerializableData)
  908. return ReadUnknownISerializableData(CreateReaderOverChildNodes(xmlAttributes, xmlChildNodes), dataContractName, dataContractNamespace);
  909. else if (couldBeClassData)
  910. return ReadUnknownClassData(CreateReaderOverChildNodes(xmlAttributes, xmlChildNodes), dataContractName, dataContractNamespace);
  911. else
  912. {
  913. XmlDataNode dataNode = new XmlDataNode();
  914. InitializeExtensionDataNode(dataNode, dataContractName, dataContractNamespace);
  915. dataNode.OwnerDocument = Document;
  916. dataNode.XmlChildNodes = xmlChildNodes;
  917. dataNode.XmlAttributes = xmlAttributes;
  918. return dataNode;
  919. }
  920. }
  921. bool IsContentNode(XmlNodeType nodeType)
  922. {
  923. switch (nodeType)
  924. {
  925. case XmlNodeType.Whitespace:
  926. case XmlNodeType.SignificantWhitespace:
  927. case XmlNodeType.Comment:
  928. case XmlNodeType.ProcessingInstruction:
  929. case XmlNodeType.DocumentType:
  930. return false;
  931. default:
  932. return true;
  933. }
  934. }
  935. internal XmlReaderDelegator CreateReaderOverChildNodes(IList<XmlAttribute> xmlAttributes, IList<XmlNode> xmlChildNodes)
  936. {
  937. XmlNode wrapperElement = CreateWrapperXmlElement(Document, xmlAttributes, xmlChildNodes, null, null, null);
  938. XmlReaderDelegator nodeReader = CreateReaderDelegatorForReader(new XmlNodeReader(wrapperElement));
  939. nodeReader.MoveToContent();
  940. Read(nodeReader);
  941. return nodeReader;
  942. }
  943. internal static XmlNode CreateWrapperXmlElement(XmlDocument document, IList<XmlAttribute> xmlAttributes, IList<XmlNode> xmlChildNodes, string prefix, string localName, string ns)
  944. {
  945. localName = localName ?? "wrapper";
  946. ns = ns ?? String.Empty;
  947. XmlNode wrapperElement = document.CreateElement(prefix, localName, ns);
  948. if (xmlAttributes != null)
  949. {
  950. for (int i = 0; i < xmlAttributes.Count; i++)
  951. wrapperElement.Attributes.Append((XmlAttribute)xmlAttributes[i]);
  952. }
  953. if (xmlChildNodes != null)
  954. {
  955. for (int i = 0; i < xmlChildNodes.Count; i++)
  956. wrapperElement.AppendChild(xmlChildNodes[i]);
  957. }
  958. return wrapperElement;
  959. }
  960. XmlAttribute AddNamespaceDeclaration(string prefix, string ns)
  961. {
  962. XmlAttribute attribute = (prefix == null || prefix.Length == 0) ?
  963. Document.CreateAttribute(null, Globals.XmlnsPrefix, Globals.XmlnsNamespace) :
  964. Document.CreateAttribute(Globals.XmlnsPrefix, prefix, Globals.XmlnsNamespace);
  965. attribute.Value = ns;
  966. return attribute;
  967. }
  968. public static Exception CreateUnexpectedStateException(XmlNodeType expectedState, XmlReaderDelegator xmlReader)
  969. {
  970. return XmlObjectSerializer.CreateSerializationExceptionWithReaderDetails(SR.GetString(SR.ExpectingState, expectedState), xmlReader);
  971. }
  972. protected virtual object ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader)
  973. {
  974. return dataContract.ReadXmlValue(reader, this);
  975. }
  976. protected virtual XmlReaderDelegator CreateReaderDelegatorForReader(XmlReader xmlReader)
  977. {
  978. return new XmlReaderDelegator(xmlReader);
  979. }
  980. protected virtual bool IsReadingCollectionExtensionData(XmlReaderDelegator xmlReader)
  981. {
  982. return (attributes.ArraySZSize != -1);
  983. }
  984. protected virtual bool IsReadingClassExtensionData(XmlReaderDelegator xmlReader)
  985. {
  986. return false;
  987. }
  988. }
  989. }