Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / NetFx35 / System.ServiceModel.Web / System / Runtime / Serialization / Json / JsonClassDataContract.cs / 1 / JsonClassDataContract.cs
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //--------------------------------------------------------------- namespace System.Runtime.Serialization.Json { using System.Threading; using System.Xml; using System.Diagnostics; using System.ServiceModel; using System.Collections.Generic; using System.Security; class JsonClassDataContract : JsonDataContract { //// Critical - holds instance of CriticalHelper which keeps state that is cached statically for serialization. // Static fields are marked SecurityCritical or readonly to prevent // data from being modified or leaked to other components in appdomain. // [SecurityCritical] JsonClassDataContractCriticalHelper helper; //// Critical - initializes SecurityCritical field 'helper' // Safe - doesn't leak anything // [SecurityCritical, SecurityTreatAsSafe] public JsonClassDataContract(ClassDataContract traditionalDataContract) : base(new JsonClassDataContractCriticalHelper(traditionalDataContract)) { this.helper = base.Helper as JsonClassDataContractCriticalHelper; } internal JsonFormatClassReaderDelegate JsonFormatReaderDelegate { //// Critical - fetches the critical JsonFormatReaderDelegate property // Safe - JsonFormatReaderDelegate only needs to be protected for write // [SecurityCritical, SecurityTreatAsSafe] get { if (helper.JsonFormatReaderDelegate == null) { lock (this) { if (helper.JsonFormatReaderDelegate == null) { JsonFormatClassReaderDelegate tempDelegate = new JsonFormatReaderGenerator().GenerateClassReader(TraditionalClassDataContract); Thread.MemoryBarrier(); helper.JsonFormatReaderDelegate = tempDelegate; } } } return helper.JsonFormatReaderDelegate; } } internal JsonFormatClassWriterDelegate JsonFormatWriterDelegate { //// Critical - fetches the critical JsonFormatWriterDelegate property // Safe - JsonFormatWriterDelegate only needs to be protected for write // [SecurityCritical, SecurityTreatAsSafe] get { if (helper.JsonFormatWriterDelegate == null) { lock (this) { if (helper.JsonFormatWriterDelegate == null) { JsonFormatClassWriterDelegate tempDelegate = new JsonFormatWriterGenerator().GenerateClassWriter(TraditionalClassDataContract); Thread.MemoryBarrier(); helper.JsonFormatWriterDelegate = tempDelegate; } } } return helper.JsonFormatWriterDelegate; } } internal XmlDictionaryString[] MemberNames { //// Critical - fetches the critical MemberNames property // Safe - MemberNames only needs to be protected for write // [SecurityCritical, SecurityTreatAsSafe] get { return this.helper.MemberNames; } } internal override string TypeName { //// Critical - fetches the critical TypeName property // Safe - TypeName only needs to be protected for write // [SecurityCritical, SecurityTreatAsSafe] get { return this.helper.TypeName; } } ClassDataContract TraditionalClassDataContract { //// Critical - fetches the critical TraditionalClassDataContract property // Safe - TraditionalClassDataContract only needs to be protected for write // [SecurityCritical, SecurityTreatAsSafe] get { return this.helper.TraditionalClassDataContract; } } public override object ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson context) { jsonReader.Read(); object o = JsonFormatReaderDelegate(jsonReader, context, XmlDictionaryString.Empty, MemberNames); jsonReader.ReadEndElement(); return o; } public override void WriteJsonValueCore(XmlWriterDelegator jsonWriter, object obj, XmlObjectSerializerWriteContextComplexJson context, RuntimeTypeHandle declaredTypeHandle) { jsonWriter.WriteAttributeString(null, JsonGlobals.typeString, null, JsonGlobals.objectString); JsonFormatWriterDelegate(jsonWriter, obj, context, TraditionalClassDataContract, MemberNames); } //// Critical - holds all state used for (de)serializing types. // since the data is cached statically, we lock down access to it. // [SecurityCritical(SecurityCriticalScope.Everything)] class JsonClassDataContractCriticalHelper : JsonDataContractCriticalHelper { JsonFormatClassReaderDelegate jsonFormatReaderDelegate; JsonFormatClassWriterDelegate jsonFormatWriterDelegate; XmlDictionaryString[] memberNames; ClassDataContract traditionalClassDataContract; string typeName; public JsonClassDataContractCriticalHelper(ClassDataContract traditionalDataContract) : base(traditionalDataContract) { this.typeName = string.IsNullOrEmpty(traditionalDataContract.Namespace.Value) ? traditionalDataContract.Name.Value : string.Concat(traditionalDataContract.Name.Value, JsonGlobals.NameValueSeparatorString, XmlObjectSerializerWriteContextComplexJson.TruncateDefaultDataContractNamespace(traditionalDataContract.Namespace.Value)); this.traditionalClassDataContract = traditionalDataContract; CopyMembersAndCheckDuplicateNames(); } internal JsonFormatClassReaderDelegate JsonFormatReaderDelegate { get { return this.jsonFormatReaderDelegate; } set { this.jsonFormatReaderDelegate = value; } } internal JsonFormatClassWriterDelegate JsonFormatWriterDelegate { get { return this.jsonFormatWriterDelegate; } set { this.jsonFormatWriterDelegate = value; } } internal XmlDictionaryString[] MemberNames { get { return this.memberNames; } } internal ClassDataContract TraditionalClassDataContract { get { return this.traditionalClassDataContract; } } void CopyMembersAndCheckDuplicateNames() { if (traditionalClassDataContract.MemberNames != null) { int memberCount = traditionalClassDataContract.MemberNames.Length; DictionarymemberTable = new Dictionary (memberCount); XmlDictionaryString[] decodedMemberNames = new XmlDictionaryString[memberCount]; for (int i = 0; i < memberCount; i++) { if (memberTable.ContainsKey(traditionalClassDataContract.MemberNames[i].Value)) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SerializationException(SR2.GetString(SR2.JsonDuplicateMemberNames, DataContract.GetClrTypeFullName(traditionalClassDataContract.UnderlyingType), traditionalClassDataContract.MemberNames[i].Value))); } else { memberTable.Add(traditionalClassDataContract.MemberNames[i].Value, null); decodedMemberNames[i] = DataContractJsonSerializer.ConvertXmlNameToJsonName(traditionalClassDataContract.MemberNames[i]); } } this.memberNames = decodedMemberNames; } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DynamicILGenerator.cs
- Highlights.cs
- ParameterToken.cs
- TypedServiceChannelBuilder.cs
- ThreadSafeList.cs
- Matrix.cs
- DropDownList.cs
- LowerCaseStringConverter.cs
- ValueConversionAttribute.cs
- PathFigureCollection.cs
- SqlMethodTransformer.cs
- DBCommand.cs
- AnnotationResourceChangedEventArgs.cs
- SupportsEventValidationAttribute.cs
- CompareValidator.cs
- SmiXetterAccessMap.cs
- PartialClassGenerationTaskInternal.cs
- NodeFunctions.cs
- ECDiffieHellman.cs
- WindowsGraphicsWrapper.cs
- MenuBase.cs
- IIS7UserPrincipal.cs
- CheckoutException.cs
- WebEventTraceProvider.cs
- TablePattern.cs
- PasswordTextContainer.cs
- TableCellAutomationPeer.cs
- ColorBlend.cs
- SettingsProperty.cs
- UnsafeNativeMethods.cs
- RegionInfo.cs
- ShapingEngine.cs
- PasswordBoxAutomationPeer.cs
- XmlLoader.cs
- BindingExpressionBase.cs
- MetadataItem_Static.cs
- DragDrop.cs
- Lease.cs
- HostedController.cs
- XsdDuration.cs
- _SafeNetHandles.cs
- DependencyObjectPropertyDescriptor.cs
- SyndicationElementExtensionCollection.cs
- StorageAssociationSetMapping.cs
- PageContent.cs
- FileDialog_Vista_Interop.cs
- TrackingStringDictionary.cs
- DependencyPropertyValueSerializer.cs
- ObjectParameterCollection.cs
- ApplyHostConfigurationBehavior.cs
- EntityDataSourceDesigner.cs
- ButtonFieldBase.cs
- BuilderElements.cs
- Rule.cs
- RangeBase.cs
- PolyLineSegment.cs
- XmlEntityReference.cs
- BitVector32.cs
- EdmComplexPropertyAttribute.cs
- MergePropertyDescriptor.cs
- AstTree.cs
- DictionaryBase.cs
- SizeKeyFrameCollection.cs
- HMACMD5.cs
- DataGridViewElement.cs
- ModuleConfigurationInfo.cs
- TextSimpleMarkerProperties.cs
- Utils.cs
- HttpCachePolicy.cs
- InputMethodStateChangeEventArgs.cs
- AxHostDesigner.cs
- DocumentViewerBase.cs
- QuaternionValueSerializer.cs
- BlurEffect.cs
- DataServiceClientException.cs
- LoadRetryHandler.cs
- PartialTrustVisibleAssembliesSection.cs
- ColorDialog.cs
- CompoundFileDeflateTransform.cs
- SqlDataSourceAdvancedOptionsForm.cs
- AssemblyInfo.cs
- IdentityNotMappedException.cs
- FloaterParagraph.cs
- ThreadStartException.cs
- ProcessThreadCollection.cs
- CompilerInfo.cs
- KeyProperty.cs
- Panel.cs
- OleServicesContext.cs
- AttachedPropertyBrowsableAttribute.cs
- Utility.cs
- InternalBufferOverflowException.cs
- EndpointDiscoveryBehavior.cs
- AnimationException.cs
- AudioLevelUpdatedEventArgs.cs
- ValidatedMobileControlConverter.cs
- CreateRefExpr.cs
- CodeAccessSecurityEngine.cs
- DataGridViewRowConverter.cs
- Convert.cs