PageRenderTime 80ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/WCFWebApi/src/Microsoft.Runtime.Serialization.Internal/Microsoft/Runtime/Serialization/PrimitiveDataContract.cs

#
C# | 518 lines | 453 code | 62 blank | 3 comment | 4 complexity | d4a17a25076a8610bbc94049b3e82130 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, Apache-2.0
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace Microsoft.Runtime.Serialization
  5. {
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Diagnostics.CodeAnalysis;
  9. using System.Security;
  10. using System.Xml;
  11. using Microsoft.Server.Common;
  12. #if USE_REFEMIT
  13. public abstract class PrimitiveDataContract : DataContract
  14. #else
  15. internal abstract class PrimitiveDataContract : DataContract
  16. #endif
  17. {
  18. [Fx.Tag.SecurityNote(Critical = "Holds instance of CriticalHelper which keeps state that is cached statically for serialization."
  19. + " Static fields are marked SecurityCritical or readonly to prevent data from being modified or leaked to other components in appdomain.")]
  20. [SecurityCritical]
  21. [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields", Justification = "This is cloned code.")]
  22. PrimitiveDataContractCriticalHelper helper;
  23. [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
  24. Safe = "Doesn't leak anything.")]
  25. [SecuritySafeCritical]
  26. protected PrimitiveDataContract(Type type, XmlDictionaryString name, XmlDictionaryString ns)
  27. : base(new PrimitiveDataContractCriticalHelper(type, name, ns))
  28. {
  29. helper = base.Helper as PrimitiveDataContractCriticalHelper;
  30. }
  31. static internal PrimitiveDataContract GetPrimitiveDataContract(Type type)
  32. {
  33. return DataContract.GetBuiltInDataContract(type) as PrimitiveDataContract;
  34. }
  35. static internal PrimitiveDataContract GetPrimitiveDataContract(string name, string ns)
  36. {
  37. return DataContract.GetBuiltInDataContract(name, ns) as PrimitiveDataContract;
  38. }
  39. internal override XmlDictionaryString TopLevelElementNamespace
  40. {
  41. get { return DictionaryGlobals.SerializationNamespace; }
  42. set { }
  43. }
  44. internal override bool CanContainReferences
  45. {
  46. get { return false; }
  47. }
  48. internal override bool IsPrimitive
  49. {
  50. get { return true; }
  51. }
  52. internal override bool IsBuiltInDataContract
  53. {
  54. get
  55. {
  56. return true;
  57. }
  58. }
  59. internal override bool Equals(object other, Dictionary<DataContractPairKey, object> checkedContracts)
  60. {
  61. PrimitiveDataContract dataContract = other as PrimitiveDataContract;
  62. if (dataContract != null)
  63. {
  64. Type thisType = this.GetType();
  65. Type otherType = other.GetType();
  66. return (thisType.Equals(otherType) || thisType.IsSubclassOf(otherType) || otherType.IsSubclassOf(thisType));
  67. }
  68. return false;
  69. }
  70. [Fx.Tag.SecurityNote(Critical = "Holds all state used for for (de)serializing primitives."
  71. + " Since the data is cached statically, we lock down access to it.")]
  72. [SecurityCritical]
  73. class PrimitiveDataContractCriticalHelper : DataContract.DataContractCriticalHelper
  74. {
  75. internal PrimitiveDataContractCriticalHelper(Type type, XmlDictionaryString name, XmlDictionaryString ns)
  76. : base(type)
  77. {
  78. SetDataContractName(name, ns);
  79. }
  80. }
  81. }
  82. internal class CharDataContract : PrimitiveDataContract
  83. {
  84. internal CharDataContract()
  85. : this(DictionaryGlobals.CharLocalName, DictionaryGlobals.SerializationNamespace)
  86. {
  87. }
  88. internal CharDataContract(XmlDictionaryString name, XmlDictionaryString ns)
  89. : base(typeof(char), name, ns)
  90. {
  91. }
  92. }
  93. internal class AsmxCharDataContract : CharDataContract
  94. {
  95. internal AsmxCharDataContract()
  96. : base(DictionaryGlobals.CharLocalName, DictionaryGlobals.AsmxTypesNamespace)
  97. {
  98. }
  99. }
  100. internal class BooleanDataContract : PrimitiveDataContract
  101. {
  102. internal BooleanDataContract()
  103. : base(typeof(bool), DictionaryGlobals.BooleanLocalName, DictionaryGlobals.SchemaNamespace)
  104. {
  105. }
  106. }
  107. internal class SignedByteDataContract : PrimitiveDataContract
  108. {
  109. internal SignedByteDataContract()
  110. : base(typeof(sbyte), DictionaryGlobals.SignedByteLocalName, DictionaryGlobals.SchemaNamespace)
  111. {
  112. }
  113. }
  114. internal class UnsignedByteDataContract : PrimitiveDataContract
  115. {
  116. internal UnsignedByteDataContract()
  117. : base(typeof(byte), DictionaryGlobals.UnsignedByteLocalName, DictionaryGlobals.SchemaNamespace)
  118. {
  119. }
  120. }
  121. internal class ShortDataContract : PrimitiveDataContract
  122. {
  123. internal ShortDataContract()
  124. : base(typeof(short), DictionaryGlobals.ShortLocalName, DictionaryGlobals.SchemaNamespace)
  125. {
  126. }
  127. }
  128. internal class UnsignedShortDataContract : PrimitiveDataContract
  129. {
  130. internal UnsignedShortDataContract()
  131. : base(typeof(ushort), DictionaryGlobals.UnsignedShortLocalName, DictionaryGlobals.SchemaNamespace)
  132. {
  133. }
  134. }
  135. internal class IntDataContract : PrimitiveDataContract
  136. {
  137. internal IntDataContract()
  138. : base(typeof(int), DictionaryGlobals.IntLocalName, DictionaryGlobals.SchemaNamespace)
  139. {
  140. }
  141. }
  142. internal class UnsignedIntDataContract : PrimitiveDataContract
  143. {
  144. internal UnsignedIntDataContract()
  145. : base(typeof(uint), DictionaryGlobals.UnsignedIntLocalName, DictionaryGlobals.SchemaNamespace)
  146. {
  147. }
  148. }
  149. internal class LongDataContract : PrimitiveDataContract
  150. {
  151. internal LongDataContract()
  152. : this(DictionaryGlobals.LongLocalName, DictionaryGlobals.SchemaNamespace)
  153. {
  154. }
  155. internal LongDataContract(XmlDictionaryString name, XmlDictionaryString ns)
  156. : base(typeof(long), name, ns)
  157. {
  158. }
  159. }
  160. internal class IntegerDataContract : LongDataContract
  161. {
  162. internal IntegerDataContract()
  163. : base(DictionaryGlobals.integerLocalName, DictionaryGlobals.SchemaNamespace)
  164. {
  165. }
  166. }
  167. internal class PositiveIntegerDataContract : LongDataContract
  168. {
  169. internal PositiveIntegerDataContract()
  170. : base(DictionaryGlobals.positiveIntegerLocalName, DictionaryGlobals.SchemaNamespace)
  171. {
  172. }
  173. }
  174. internal class NegativeIntegerDataContract : LongDataContract
  175. {
  176. internal NegativeIntegerDataContract()
  177. : base(DictionaryGlobals.negativeIntegerLocalName, DictionaryGlobals.SchemaNamespace)
  178. {
  179. }
  180. }
  181. internal class NonPositiveIntegerDataContract : LongDataContract
  182. {
  183. internal NonPositiveIntegerDataContract()
  184. : base(DictionaryGlobals.nonPositiveIntegerLocalName, DictionaryGlobals.SchemaNamespace)
  185. {
  186. }
  187. }
  188. internal class NonNegativeIntegerDataContract : LongDataContract
  189. {
  190. internal NonNegativeIntegerDataContract()
  191. : base(DictionaryGlobals.nonNegativeIntegerLocalName, DictionaryGlobals.SchemaNamespace)
  192. {
  193. }
  194. }
  195. internal class UnsignedLongDataContract : PrimitiveDataContract
  196. {
  197. internal UnsignedLongDataContract()
  198. : base(typeof(ulong), DictionaryGlobals.UnsignedLongLocalName, DictionaryGlobals.SchemaNamespace)
  199. {
  200. }
  201. }
  202. internal class FloatDataContract : PrimitiveDataContract
  203. {
  204. internal FloatDataContract()
  205. : base(typeof(float), DictionaryGlobals.FloatLocalName, DictionaryGlobals.SchemaNamespace)
  206. {
  207. }
  208. }
  209. internal class DoubleDataContract : PrimitiveDataContract
  210. {
  211. internal DoubleDataContract()
  212. : base(typeof(double), DictionaryGlobals.DoubleLocalName, DictionaryGlobals.SchemaNamespace)
  213. {
  214. }
  215. }
  216. internal class DecimalDataContract : PrimitiveDataContract
  217. {
  218. internal DecimalDataContract()
  219. : base(typeof(decimal), DictionaryGlobals.DecimalLocalName, DictionaryGlobals.SchemaNamespace)
  220. {
  221. }
  222. }
  223. internal class DateTimeDataContract : PrimitiveDataContract
  224. {
  225. internal DateTimeDataContract()
  226. : base(typeof(DateTime), DictionaryGlobals.DateTimeLocalName, DictionaryGlobals.SchemaNamespace)
  227. {
  228. }
  229. }
  230. internal class StringDataContract : PrimitiveDataContract
  231. {
  232. internal StringDataContract()
  233. : this(DictionaryGlobals.StringLocalName, DictionaryGlobals.SchemaNamespace)
  234. {
  235. }
  236. internal StringDataContract(XmlDictionaryString name, XmlDictionaryString ns)
  237. : base(typeof(string), name, ns)
  238. {
  239. }
  240. }
  241. internal class TimeDataContract : StringDataContract
  242. {
  243. internal TimeDataContract()
  244. : base(DictionaryGlobals.timeLocalName, DictionaryGlobals.SchemaNamespace)
  245. {
  246. }
  247. }
  248. internal class DateDataContract : StringDataContract
  249. {
  250. internal DateDataContract()
  251. : base(DictionaryGlobals.dateLocalName, DictionaryGlobals.SchemaNamespace)
  252. {
  253. }
  254. }
  255. internal class HexBinaryDataContract : StringDataContract
  256. {
  257. internal HexBinaryDataContract()
  258. : base(DictionaryGlobals.hexBinaryLocalName, DictionaryGlobals.SchemaNamespace)
  259. {
  260. }
  261. }
  262. internal class GYearMonthDataContract : StringDataContract
  263. {
  264. internal GYearMonthDataContract()
  265. : base(DictionaryGlobals.gYearMonthLocalName, DictionaryGlobals.SchemaNamespace)
  266. {
  267. }
  268. }
  269. internal class GYearDataContract : StringDataContract
  270. {
  271. internal GYearDataContract()
  272. : base(DictionaryGlobals.gYearLocalName, DictionaryGlobals.SchemaNamespace)
  273. {
  274. }
  275. }
  276. internal class GMonthDayDataContract : StringDataContract
  277. {
  278. internal GMonthDayDataContract()
  279. : base(DictionaryGlobals.gMonthDayLocalName, DictionaryGlobals.SchemaNamespace)
  280. {
  281. }
  282. }
  283. internal class GDayDataContract : StringDataContract
  284. {
  285. internal GDayDataContract()
  286. : base(DictionaryGlobals.gDayLocalName, DictionaryGlobals.SchemaNamespace)
  287. {
  288. }
  289. }
  290. internal class GMonthDataContract : StringDataContract
  291. {
  292. internal GMonthDataContract()
  293. : base(DictionaryGlobals.gMonthLocalName, DictionaryGlobals.SchemaNamespace)
  294. {
  295. }
  296. }
  297. internal class NormalizedStringDataContract : StringDataContract
  298. {
  299. internal NormalizedStringDataContract()
  300. : base(DictionaryGlobals.normalizedStringLocalName, DictionaryGlobals.SchemaNamespace)
  301. {
  302. }
  303. }
  304. internal class TokenDataContract : StringDataContract
  305. {
  306. internal TokenDataContract()
  307. : base(DictionaryGlobals.tokenLocalName, DictionaryGlobals.SchemaNamespace)
  308. {
  309. }
  310. }
  311. internal class LanguageDataContract : StringDataContract
  312. {
  313. internal LanguageDataContract()
  314. : base(DictionaryGlobals.languageLocalName, DictionaryGlobals.SchemaNamespace)
  315. {
  316. }
  317. }
  318. internal class NameDataContract : StringDataContract
  319. {
  320. internal NameDataContract()
  321. : base(DictionaryGlobals.NameLocalName, DictionaryGlobals.SchemaNamespace)
  322. {
  323. }
  324. }
  325. internal class NCNameDataContract : StringDataContract
  326. {
  327. internal NCNameDataContract() : base(DictionaryGlobals.NCNameLocalName, DictionaryGlobals.SchemaNamespace)
  328. {
  329. }
  330. }
  331. internal class IDDataContract : StringDataContract
  332. {
  333. internal IDDataContract()
  334. : base(DictionaryGlobals.XSDIDLocalName, DictionaryGlobals.SchemaNamespace)
  335. {
  336. }
  337. }
  338. internal class IDREFDataContract : StringDataContract
  339. {
  340. internal IDREFDataContract()
  341. : base(DictionaryGlobals.IDREFLocalName, DictionaryGlobals.SchemaNamespace)
  342. {
  343. }
  344. }
  345. internal class IDREFSDataContract : StringDataContract
  346. {
  347. internal IDREFSDataContract()
  348. : base(DictionaryGlobals.IDREFSLocalName, DictionaryGlobals.SchemaNamespace)
  349. {
  350. }
  351. }
  352. internal class ENTITYDataContract : StringDataContract
  353. {
  354. internal ENTITYDataContract()
  355. : base(DictionaryGlobals.ENTITYLocalName, DictionaryGlobals.SchemaNamespace)
  356. {
  357. }
  358. }
  359. internal class ENTITIESDataContract : StringDataContract
  360. {
  361. internal ENTITIESDataContract()
  362. : base(DictionaryGlobals.ENTITIESLocalName, DictionaryGlobals.SchemaNamespace)
  363. {
  364. }
  365. }
  366. internal class NMTOKENDataContract : StringDataContract
  367. {
  368. internal NMTOKENDataContract()
  369. : base(DictionaryGlobals.NMTOKENLocalName, DictionaryGlobals.SchemaNamespace)
  370. {
  371. }
  372. }
  373. internal class NMTOKENSDataContract : StringDataContract
  374. {
  375. internal NMTOKENSDataContract()
  376. : base(DictionaryGlobals.NMTOKENSLocalName, DictionaryGlobals.SchemaNamespace)
  377. {
  378. }
  379. }
  380. internal class ByteArrayDataContract : PrimitiveDataContract
  381. {
  382. internal ByteArrayDataContract()
  383. : base(typeof(byte[]), DictionaryGlobals.ByteArrayLocalName, DictionaryGlobals.SchemaNamespace)
  384. {
  385. }
  386. }
  387. internal class ObjectDataContract : PrimitiveDataContract
  388. {
  389. internal ObjectDataContract()
  390. : base(typeof(object), DictionaryGlobals.ObjectLocalName, DictionaryGlobals.SchemaNamespace)
  391. {
  392. }
  393. internal override bool CanContainReferences
  394. {
  395. get { return true; }
  396. }
  397. internal override bool IsPrimitive
  398. {
  399. get { return false; }
  400. }
  401. }
  402. internal class TimeSpanDataContract : PrimitiveDataContract
  403. {
  404. internal TimeSpanDataContract()
  405. : this(DictionaryGlobals.TimeSpanLocalName, DictionaryGlobals.SerializationNamespace)
  406. {
  407. }
  408. internal TimeSpanDataContract(XmlDictionaryString name, XmlDictionaryString ns)
  409. : base(typeof(TimeSpan), name, ns)
  410. {
  411. }
  412. }
  413. internal class XsDurationDataContract : TimeSpanDataContract
  414. {
  415. internal XsDurationDataContract()
  416. : base(DictionaryGlobals.TimeSpanLocalName, DictionaryGlobals.SchemaNamespace)
  417. {
  418. }
  419. }
  420. internal class GuidDataContract : PrimitiveDataContract
  421. {
  422. internal GuidDataContract()
  423. : this(DictionaryGlobals.GuidLocalName, DictionaryGlobals.SerializationNamespace)
  424. {
  425. }
  426. internal GuidDataContract(XmlDictionaryString name, XmlDictionaryString ns)
  427. : base(typeof(Guid), name, ns)
  428. {
  429. }
  430. }
  431. internal class AsmxGuidDataContract : GuidDataContract
  432. {
  433. internal AsmxGuidDataContract()
  434. : base(DictionaryGlobals.GuidLocalName, DictionaryGlobals.AsmxTypesNamespace)
  435. {
  436. }
  437. }
  438. internal class UriDataContract : PrimitiveDataContract
  439. {
  440. internal UriDataContract()
  441. : base(typeof(Uri), DictionaryGlobals.UriLocalName, DictionaryGlobals.SchemaNamespace)
  442. {
  443. }
  444. }
  445. internal class QNameDataContract : PrimitiveDataContract
  446. {
  447. internal QNameDataContract()
  448. : base(typeof(XmlQualifiedName), DictionaryGlobals.QNameLocalName, DictionaryGlobals.SchemaNamespace)
  449. {
  450. }
  451. internal override bool IsPrimitive
  452. {
  453. get { return false; }
  454. }
  455. }
  456. }