JsonEnumDataContract.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. //----------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //----------------------------------------------------------------
  4. namespace System.Runtime.Serialization.Json
  5. {
  6. using System.Xml;
  7. using System.Security;
  8. class JsonEnumDataContract : JsonDataContract
  9. {
  10. [Fx.Tag.SecurityNote(Critical = "Holds instance of CriticalHelper which keeps state that is cached statically for serialization."
  11. + "Static fields are marked SecurityCritical or readonly to prevent data from being modified or leaked to other components in appdomain.")]
  12. [SecurityCritical]
  13. JsonEnumDataContractCriticalHelper helper;
  14. [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
  15. Safe = "Doesn't leak anything.")]
  16. [SecuritySafeCritical]
  17. public JsonEnumDataContract(EnumDataContract traditionalDataContract)
  18. : base(new JsonEnumDataContractCriticalHelper(traditionalDataContract))
  19. {
  20. this.helper = base.Helper as JsonEnumDataContractCriticalHelper;
  21. }
  22. public bool IsULong
  23. {
  24. [Fx.Tag.SecurityNote(Critical = "Fetches the critical IsULong property.",
  25. Safe = "IsULong only needs to be protected for write.")]
  26. [SecuritySafeCritical]
  27. get { return this.helper.IsULong; }
  28. }
  29. public override object ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson context)
  30. {
  31. object enumValue;
  32. if (IsULong)
  33. {
  34. enumValue = Enum.ToObject(TraditionalDataContract.UnderlyingType, jsonReader.ReadElementContentAsUnsignedLong());
  35. }
  36. else
  37. {
  38. enumValue = Enum.ToObject(TraditionalDataContract.UnderlyingType, jsonReader.ReadElementContentAsLong());
  39. }
  40. if (context != null)
  41. {
  42. context.AddNewObject(enumValue);
  43. }
  44. return enumValue;
  45. }
  46. public override void WriteJsonValueCore(XmlWriterDelegator jsonWriter, object obj, XmlObjectSerializerWriteContextComplexJson context, RuntimeTypeHandle declaredTypeHandle)
  47. {
  48. if (IsULong)
  49. {
  50. jsonWriter.WriteUnsignedLong(((IConvertible)obj).ToUInt64(null));
  51. }
  52. else
  53. {
  54. jsonWriter.WriteLong(((IConvertible)obj).ToInt64(null));
  55. }
  56. }
  57. [Fx.Tag.SecurityNote(Critical = "Holds all state used for (de)serializing types."
  58. + "Since the data is cached statically, we lock down access to it.")]
  59. #if !NO_SECURITY_ATTRIBUTES
  60. #pragma warning disable 618 // have not moved to the v4 security model yet
  61. [SecurityCritical(SecurityCriticalScope.Everything)]
  62. #pragma warning restore 618
  63. #endif
  64. class JsonEnumDataContractCriticalHelper : JsonDataContractCriticalHelper
  65. {
  66. bool isULong;
  67. public JsonEnumDataContractCriticalHelper(EnumDataContract traditionalEnumDataContract)
  68. : base(traditionalEnumDataContract)
  69. {
  70. isULong = traditionalEnumDataContract.IsULong;
  71. }
  72. public bool IsULong
  73. {
  74. get { return this.isULong; }
  75. }
  76. }
  77. }
  78. }