Attributes.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.Runtime.Serialization
  5. {
  6. using System.Security;
  7. using System.Xml;
  8. class Attributes
  9. {
  10. [Fx.Tag.SecurityNote(Critical = "Static field used to store the attribute names to read during deserialization."
  11. + " Static fields are marked SecurityCritical or readonly to prevent"
  12. + " data from being modified or leaked to other components in appdomain.")]
  13. [SecurityCritical]
  14. static XmlDictionaryString[] serializationLocalNames;
  15. [Fx.Tag.SecurityNote(Critical = "Static field used to store the attribute names to read during deserialization."
  16. + " Static fields are marked SecurityCritical or readonly to prevent"
  17. + " data from being modified or leaked to other components in appdomain.")]
  18. [SecurityCritical]
  19. static XmlDictionaryString[] schemaInstanceLocalNames;
  20. [Fx.Tag.SecurityNote(Critical = "Initializes critical static fields.",
  21. Safe = "Doesn't leak anything.")]
  22. [SecuritySafeCritical]
  23. static Attributes()
  24. {
  25. serializationLocalNames = new XmlDictionaryString[]
  26. {
  27. DictionaryGlobals.IdLocalName,
  28. DictionaryGlobals.ArraySizeLocalName,
  29. DictionaryGlobals.RefLocalName,
  30. DictionaryGlobals.ClrTypeLocalName,
  31. DictionaryGlobals.ClrAssemblyLocalName,
  32. DictionaryGlobals.ISerializableFactoryTypeLocalName
  33. };
  34. schemaInstanceLocalNames = new XmlDictionaryString[]
  35. {
  36. DictionaryGlobals.XsiNilLocalName,
  37. DictionaryGlobals.XsiTypeLocalName
  38. };
  39. }
  40. internal string Id;
  41. internal string Ref;
  42. internal string XsiTypeName;
  43. internal string XsiTypeNamespace;
  44. internal string XsiTypePrefix;
  45. internal bool XsiNil;
  46. internal string ClrAssembly;
  47. internal string ClrType;
  48. internal int ArraySZSize;
  49. internal string FactoryTypeName;
  50. internal string FactoryTypeNamespace;
  51. internal string FactoryTypePrefix;
  52. internal bool UnrecognizedAttributesFound;
  53. [SecuritySafeCritical]
  54. internal void Read(XmlReaderDelegator reader)
  55. {
  56. Reset();
  57. while (reader.MoveToNextAttribute())
  58. {
  59. switch (reader.IndexOfLocalName(serializationLocalNames, DictionaryGlobals.SerializationNamespace))
  60. {
  61. case 0:
  62. ReadId(reader);
  63. break;
  64. case 1:
  65. ReadArraySize(reader);
  66. break;
  67. case 2:
  68. ReadRef(reader);
  69. break;
  70. case 3:
  71. ClrType = reader.Value;
  72. break;
  73. case 4:
  74. ClrAssembly = reader.Value;
  75. break;
  76. case 5:
  77. ReadFactoryType(reader);
  78. break;
  79. default:
  80. switch (reader.IndexOfLocalName(schemaInstanceLocalNames, DictionaryGlobals.SchemaInstanceNamespace))
  81. {
  82. case 0:
  83. ReadXsiNil(reader);
  84. break;
  85. case 1:
  86. ReadXsiType(reader);
  87. break;
  88. default:
  89. if (!reader.IsNamespaceUri(DictionaryGlobals.XmlnsNamespace))
  90. UnrecognizedAttributesFound = true;
  91. break;
  92. }
  93. break;
  94. }
  95. }
  96. reader.MoveToElement();
  97. }
  98. internal void Reset()
  99. {
  100. Id = Globals.NewObjectId;
  101. Ref = Globals.NewObjectId;
  102. XsiTypeName = null;
  103. XsiTypeNamespace = null;
  104. XsiTypePrefix = null;
  105. XsiNil = false;
  106. ClrAssembly = null;
  107. ClrType = null;
  108. ArraySZSize = -1;
  109. FactoryTypeName = null;
  110. FactoryTypeNamespace = null;
  111. FactoryTypePrefix = null;
  112. UnrecognizedAttributesFound = false;
  113. }
  114. void ReadId(XmlReaderDelegator reader)
  115. {
  116. Id = reader.ReadContentAsString();
  117. if (string.IsNullOrEmpty(Id))
  118. {
  119. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.InvalidXsIdDefinition, Id)));
  120. }
  121. }
  122. void ReadRef(XmlReaderDelegator reader)
  123. {
  124. Ref = reader.ReadContentAsString();
  125. if (string.IsNullOrEmpty(Ref))
  126. {
  127. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.InvalidXsRefDefinition, Ref)));
  128. }
  129. }
  130. void ReadXsiNil(XmlReaderDelegator reader)
  131. {
  132. XsiNil = reader.ReadContentAsBoolean();
  133. }
  134. void ReadArraySize(XmlReaderDelegator reader)
  135. {
  136. ArraySZSize = reader.ReadContentAsInt();
  137. if (ArraySZSize < 0)
  138. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.InvalidSizeDefinition, ArraySZSize)));
  139. }
  140. void ReadXsiType(XmlReaderDelegator reader)
  141. {
  142. string xsiTypeString = reader.Value;
  143. if (xsiTypeString != null && xsiTypeString.Length > 0)
  144. XmlObjectSerializerReadContext.ParseQualifiedName(xsiTypeString, reader, out XsiTypeName, out XsiTypeNamespace, out XsiTypePrefix);
  145. }
  146. void ReadFactoryType(XmlReaderDelegator reader)
  147. {
  148. string factoryTypeString = reader.Value;
  149. if (factoryTypeString != null && factoryTypeString.Length > 0)
  150. XmlObjectSerializerReadContext.ParseQualifiedName(factoryTypeString, reader, out FactoryTypeName, out FactoryTypeNamespace, out FactoryTypePrefix);
  151. }
  152. }
  153. }