Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / Serialization / System / Runtime / Serialization / Json / JsonCollectionDataContract.cs / 1305376 / JsonCollectionDataContract.cs
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //--------------------------------------------------------------- namespace System.Runtime.Serialization.Json { using System.Threading; using System.Xml; using System.Security; class JsonCollectionDataContract : JsonDataContract { [Fx.Tag.SecurityNote(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] JsonCollectionDataContractCriticalHelper helper; [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.", Safe = "Doesn't leak anything.")] [SecuritySafeCritical] public JsonCollectionDataContract(CollectionDataContract traditionalDataContract) : base(new JsonCollectionDataContractCriticalHelper(traditionalDataContract)) { this.helper = base.Helper as JsonCollectionDataContractCriticalHelper; } internal JsonFormatCollectionReaderDelegate JsonFormatReaderDelegate { [Fx.Tag.SecurityNote(Critical = "Fetches the critical JsonFormatReaderDelegate property.", Safe = "JsonFormatReaderDelegate only needs to be protected for write.")] [SecuritySafeCritical] get { if (helper.JsonFormatReaderDelegate == null) { lock (this) { if (helper.JsonFormatReaderDelegate == null) { JsonFormatCollectionReaderDelegate tempDelegate = new JsonFormatReaderGenerator().GenerateCollectionReader(TraditionalCollectionDataContract); Thread.MemoryBarrier(); helper.JsonFormatReaderDelegate = tempDelegate; } } } return helper.JsonFormatReaderDelegate; } } internal JsonFormatGetOnlyCollectionReaderDelegate JsonFormatGetOnlyReaderDelegate { [Fx.Tag.SecurityNote(Critical = "Fetches the critical JsonFormatGetOnlyReaderDelegate property.", Safe = "JsonFormatGetOnlyReaderDelegate only needs to be protected for write; initialized in getter if null.")] [SecuritySafeCritical] get { if (helper.JsonFormatGetOnlyReaderDelegate == null) { lock (this) { if (helper.JsonFormatGetOnlyReaderDelegate == null) { JsonFormatGetOnlyCollectionReaderDelegate tempDelegate = new JsonFormatReaderGenerator().GenerateGetOnlyCollectionReader(TraditionalCollectionDataContract); Thread.MemoryBarrier(); helper.JsonFormatGetOnlyReaderDelegate = tempDelegate; } } } return helper.JsonFormatGetOnlyReaderDelegate; } } internal JsonFormatCollectionWriterDelegate JsonFormatWriterDelegate { [Fx.Tag.SecurityNote(Critical = "Fetches the critical JsonFormatWriterDelegate property.", Safe = "JsonFormatWriterDelegate only needs to be protected for write.")] [SecuritySafeCritical] get { if (helper.JsonFormatWriterDelegate == null) { lock (this) { if (helper.JsonFormatWriterDelegate == null) { JsonFormatCollectionWriterDelegate tempDelegate = new JsonFormatWriterGenerator().GenerateCollectionWriter(TraditionalCollectionDataContract); Thread.MemoryBarrier(); helper.JsonFormatWriterDelegate = tempDelegate; } } } return helper.JsonFormatWriterDelegate; } } CollectionDataContract TraditionalCollectionDataContract { [Fx.Tag.SecurityNote(Critical = "Fetches the critical TraditionalCollectionDataContract property.", Safe = "TraditionalCollectionDataContract only needs to be protected for write.")] [SecuritySafeCritical] get { return this.helper.TraditionalCollectionDataContract; } } public override object ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson context) { jsonReader.Read(); object o = null; if (context.IsGetOnlyCollection) { // IsGetOnlyCollection value has already been used to create current collectiondatacontract, value can now be reset. context.IsGetOnlyCollection = false; JsonFormatGetOnlyReaderDelegate(jsonReader, context, XmlDictionaryString.Empty, JsonGlobals.itemDictionaryString, TraditionalCollectionDataContract); } else { o = JsonFormatReaderDelegate(jsonReader, context, XmlDictionaryString.Empty, JsonGlobals.itemDictionaryString, TraditionalCollectionDataContract); } jsonReader.ReadEndElement(); return o; } public override void WriteJsonValueCore(XmlWriterDelegator jsonWriter, object obj, XmlObjectSerializerWriteContextComplexJson context, RuntimeTypeHandle declaredTypeHandle) { // IsGetOnlyCollection value has already been used to create current collectiondatacontract, value can now be reset. context.IsGetOnlyCollection = false; JsonFormatWriterDelegate(jsonWriter, obj, context, TraditionalCollectionDataContract); } [Fx.Tag.SecurityNote(Critical = "Holds all state used for (de)serializing types." + "Since the data is cached statically, we lock down access to it.")] #pragma warning disable 618 // have not moved to the v4 security model yet [SecurityCritical(SecurityCriticalScope.Everything)] #pragma warning restore 618 class JsonCollectionDataContractCriticalHelper : JsonDataContractCriticalHelper { JsonFormatCollectionReaderDelegate jsonFormatReaderDelegate; JsonFormatGetOnlyCollectionReaderDelegate jsonFormatGetOnlyReaderDelegate; JsonFormatCollectionWriterDelegate jsonFormatWriterDelegate; CollectionDataContract traditionalCollectionDataContract; public JsonCollectionDataContractCriticalHelper(CollectionDataContract traditionalDataContract) : base(traditionalDataContract) { this.traditionalCollectionDataContract = traditionalDataContract; } internal JsonFormatCollectionReaderDelegate JsonFormatReaderDelegate { get { return this.jsonFormatReaderDelegate; } set { this.jsonFormatReaderDelegate = value; } } internal JsonFormatGetOnlyCollectionReaderDelegate JsonFormatGetOnlyReaderDelegate { get { return this.jsonFormatGetOnlyReaderDelegate; } set { this.jsonFormatGetOnlyReaderDelegate = value; } } internal JsonFormatCollectionWriterDelegate JsonFormatWriterDelegate { get { return this.jsonFormatWriterDelegate; } set { this.jsonFormatWriterDelegate = value; } } internal CollectionDataContract TraditionalCollectionDataContract { get { return this.traditionalCollectionDataContract; } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //--------------------------------------------------------------- namespace System.Runtime.Serialization.Json { using System.Threading; using System.Xml; using System.Security; class JsonCollectionDataContract : JsonDataContract { [Fx.Tag.SecurityNote(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] JsonCollectionDataContractCriticalHelper helper; [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.", Safe = "Doesn't leak anything.")] [SecuritySafeCritical] public JsonCollectionDataContract(CollectionDataContract traditionalDataContract) : base(new JsonCollectionDataContractCriticalHelper(traditionalDataContract)) { this.helper = base.Helper as JsonCollectionDataContractCriticalHelper; } internal JsonFormatCollectionReaderDelegate JsonFormatReaderDelegate { [Fx.Tag.SecurityNote(Critical = "Fetches the critical JsonFormatReaderDelegate property.", Safe = "JsonFormatReaderDelegate only needs to be protected for write.")] [SecuritySafeCritical] get { if (helper.JsonFormatReaderDelegate == null) { lock (this) { if (helper.JsonFormatReaderDelegate == null) { JsonFormatCollectionReaderDelegate tempDelegate = new JsonFormatReaderGenerator().GenerateCollectionReader(TraditionalCollectionDataContract); Thread.MemoryBarrier(); helper.JsonFormatReaderDelegate = tempDelegate; } } } return helper.JsonFormatReaderDelegate; } } internal JsonFormatGetOnlyCollectionReaderDelegate JsonFormatGetOnlyReaderDelegate { [Fx.Tag.SecurityNote(Critical = "Fetches the critical JsonFormatGetOnlyReaderDelegate property.", Safe = "JsonFormatGetOnlyReaderDelegate only needs to be protected for write; initialized in getter if null.")] [SecuritySafeCritical] get { if (helper.JsonFormatGetOnlyReaderDelegate == null) { lock (this) { if (helper.JsonFormatGetOnlyReaderDelegate == null) { JsonFormatGetOnlyCollectionReaderDelegate tempDelegate = new JsonFormatReaderGenerator().GenerateGetOnlyCollectionReader(TraditionalCollectionDataContract); Thread.MemoryBarrier(); helper.JsonFormatGetOnlyReaderDelegate = tempDelegate; } } } return helper.JsonFormatGetOnlyReaderDelegate; } } internal JsonFormatCollectionWriterDelegate JsonFormatWriterDelegate { [Fx.Tag.SecurityNote(Critical = "Fetches the critical JsonFormatWriterDelegate property.", Safe = "JsonFormatWriterDelegate only needs to be protected for write.")] [SecuritySafeCritical] get { if (helper.JsonFormatWriterDelegate == null) { lock (this) { if (helper.JsonFormatWriterDelegate == null) { JsonFormatCollectionWriterDelegate tempDelegate = new JsonFormatWriterGenerator().GenerateCollectionWriter(TraditionalCollectionDataContract); Thread.MemoryBarrier(); helper.JsonFormatWriterDelegate = tempDelegate; } } } return helper.JsonFormatWriterDelegate; } } CollectionDataContract TraditionalCollectionDataContract { [Fx.Tag.SecurityNote(Critical = "Fetches the critical TraditionalCollectionDataContract property.", Safe = "TraditionalCollectionDataContract only needs to be protected for write.")] [SecuritySafeCritical] get { return this.helper.TraditionalCollectionDataContract; } } public override object ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson context) { jsonReader.Read(); object o = null; if (context.IsGetOnlyCollection) { // IsGetOnlyCollection value has already been used to create current collectiondatacontract, value can now be reset. context.IsGetOnlyCollection = false; JsonFormatGetOnlyReaderDelegate(jsonReader, context, XmlDictionaryString.Empty, JsonGlobals.itemDictionaryString, TraditionalCollectionDataContract); } else { o = JsonFormatReaderDelegate(jsonReader, context, XmlDictionaryString.Empty, JsonGlobals.itemDictionaryString, TraditionalCollectionDataContract); } jsonReader.ReadEndElement(); return o; } public override void WriteJsonValueCore(XmlWriterDelegator jsonWriter, object obj, XmlObjectSerializerWriteContextComplexJson context, RuntimeTypeHandle declaredTypeHandle) { // IsGetOnlyCollection value has already been used to create current collectiondatacontract, value can now be reset. context.IsGetOnlyCollection = false; JsonFormatWriterDelegate(jsonWriter, obj, context, TraditionalCollectionDataContract); } [Fx.Tag.SecurityNote(Critical = "Holds all state used for (de)serializing types." + "Since the data is cached statically, we lock down access to it.")] #pragma warning disable 618 // have not moved to the v4 security model yet [SecurityCritical(SecurityCriticalScope.Everything)] #pragma warning restore 618 class JsonCollectionDataContractCriticalHelper : JsonDataContractCriticalHelper { JsonFormatCollectionReaderDelegate jsonFormatReaderDelegate; JsonFormatGetOnlyCollectionReaderDelegate jsonFormatGetOnlyReaderDelegate; JsonFormatCollectionWriterDelegate jsonFormatWriterDelegate; CollectionDataContract traditionalCollectionDataContract; public JsonCollectionDataContractCriticalHelper(CollectionDataContract traditionalDataContract) : base(traditionalDataContract) { this.traditionalCollectionDataContract = traditionalDataContract; } internal JsonFormatCollectionReaderDelegate JsonFormatReaderDelegate { get { return this.jsonFormatReaderDelegate; } set { this.jsonFormatReaderDelegate = value; } } internal JsonFormatGetOnlyCollectionReaderDelegate JsonFormatGetOnlyReaderDelegate { get { return this.jsonFormatGetOnlyReaderDelegate; } set { this.jsonFormatGetOnlyReaderDelegate = value; } } internal JsonFormatCollectionWriterDelegate JsonFormatWriterDelegate { get { return this.jsonFormatWriterDelegate; } set { this.jsonFormatWriterDelegate = value; } } internal CollectionDataContract TraditionalCollectionDataContract { get { return this.traditionalCollectionDataContract; } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ReachDocumentReferenceCollectionSerializerAsync.cs
- AxHost.cs
- ExceptionValidationRule.cs
- AsyncOperation.cs
- RelatedCurrencyManager.cs
- AnyAllSearchOperator.cs
- Array.cs
- HtmlInputRadioButton.cs
- ContentElement.cs
- SamlDelegatingWriter.cs
- DocumentPageViewAutomationPeer.cs
- TargetConverter.cs
- ControlParameter.cs
- TemplateXamlParser.cs
- DynamicQueryableWrapper.cs
- AsyncStreamReader.cs
- DataChangedEventManager.cs
- DiscreteKeyFrames.cs
- ControlTemplate.cs
- DetailsViewPageEventArgs.cs
- HttpRequestTraceRecord.cs
- FrameworkTextComposition.cs
- WebResourceUtil.cs
- XmlNamespaceDeclarationsAttribute.cs
- XamlReaderHelper.cs
- jithelpers.cs
- NumberFormatInfo.cs
- IgnoreFileBuildProvider.cs
- EventTrigger.cs
- AnimationStorage.cs
- RtType.cs
- DynamicRendererThreadManager.cs
- ObjectContext.cs
- EventRouteFactory.cs
- ExtensionFile.cs
- AutomationIdentifier.cs
- hwndwrapper.cs
- FixedPage.cs
- Event.cs
- CodeDirectiveCollection.cs
- EventProperty.cs
- ProgressChangedEventArgs.cs
- ChannelCredentials.cs
- XmlReflectionImporter.cs
- AnnotationMap.cs
- InvalidCastException.cs
- MetabaseSettingsIis7.cs
- MemberHolder.cs
- MarginsConverter.cs
- NumericExpr.cs
- ThreadAttributes.cs
- XmlnsPrefixAttribute.cs
- dataobject.cs
- MappedMetaModel.cs
- FtpCachePolicyElement.cs
- DataGridViewComboBoxCell.cs
- ClassDataContract.cs
- DataMisalignedException.cs
- EntityContainer.cs
- TextTreeText.cs
- NewArray.cs
- PeerObject.cs
- IpcPort.cs
- IUnknownConstantAttribute.cs
- ComponentEditorForm.cs
- CacheRequest.cs
- storagemappingitemcollection.viewdictionary.cs
- UpdatePanel.cs
- ZipIOLocalFileBlock.cs
- HtmlWindowCollection.cs
- RadioButtonAutomationPeer.cs
- CounterSampleCalculator.cs
- ToolStripItemRenderEventArgs.cs
- _BufferOffsetSize.cs
- Registry.cs
- CompilerParameters.cs
- HitTestDrawingContextWalker.cs
- RawStylusInputCustomDataList.cs
- SessionPageStatePersister.cs
- ConfigurationManager.cs
- FormsAuthenticationModule.cs
- MultiBinding.cs
- SeekableReadStream.cs
- DrawingAttributesDefaultValueFactory.cs
- OracleMonthSpan.cs
- PackUriHelper.cs
- TransactionState.cs
- DataGridViewIntLinkedList.cs
- NavigationService.cs
- SerializationObjectManager.cs
- PasswordRecoveryAutoFormat.cs
- DbDeleteCommandTree.cs
- OpCopier.cs
- AffineTransform3D.cs
- WebBaseEventKeyComparer.cs
- PageStatePersister.cs
- UIAgentMonitor.cs
- LambdaCompiler.Lambda.cs
- Random.cs
- PropertyEmitter.cs