Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / NetFx35 / System.ServiceModel.Web / System / Runtime / Serialization / Json / JsonCollectionDataContract.cs / 2 / 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
{
//
// 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;
//
// Critical - initializes SecurityCritical field 'helper'
// Safe - doesn't leak anything
//
[SecurityCritical, SecurityTreatAsSafe]
public JsonCollectionDataContract(CollectionDataContract traditionalDataContract) : base(new JsonCollectionDataContractCriticalHelper(traditionalDataContract))
{
this.helper = base.Helper as JsonCollectionDataContractCriticalHelper;
}
internal JsonFormatCollectionReaderDelegate 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)
{
JsonFormatCollectionReaderDelegate tempDelegate = new JsonFormatReaderGenerator().GenerateCollectionReader(TraditionalCollectionDataContract);
Thread.MemoryBarrier();
helper.JsonFormatReaderDelegate = tempDelegate;
}
}
}
return helper.JsonFormatReaderDelegate;
}
}
internal JsonFormatGetOnlyCollectionReaderDelegate JsonFormatGetOnlyReaderDelegate
{
///
/// Critical - fetches the critical JsonFormatGetOnlyReaderDelegate property
/// Safe - JsonFormatGetOnlyReaderDelegate only needs to be protected for write; initialized in getter if null
///
[SecurityCritical, SecurityTreatAsSafe]
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
{
//
// 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)
{
JsonFormatCollectionWriterDelegate tempDelegate = new JsonFormatWriterGenerator().GenerateCollectionWriter(TraditionalCollectionDataContract);
Thread.MemoryBarrier();
helper.JsonFormatWriterDelegate = tempDelegate;
}
}
}
return helper.JsonFormatWriterDelegate;
}
}
CollectionDataContract TraditionalCollectionDataContract
{
//
// Critical - fetches the critical TraditionalCollectionDataContract property
// Safe - TraditionalCollectionDataContract only needs to be protected for write
//
[SecurityCritical, SecurityTreatAsSafe]
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);
}
//
// 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 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SubtreeProcessor.cs
- PropagatorResult.cs
- PenLineJoinValidation.cs
- XamlWriter.cs
- Misc.cs
- _KerberosClient.cs
- KeyNotFoundException.cs
- TextBox.cs
- ScriptManagerProxy.cs
- AssemblyFilter.cs
- FormatterConverter.cs
- AssemblySettingAttributes.cs
- KeyValuePairs.cs
- WeakEventManager.cs
- ToolStripDropDown.cs
- BindableTemplateBuilder.cs
- _NetRes.cs
- TextShapeableCharacters.cs
- NamespaceList.cs
- IsolatedStoragePermission.cs
- FixedDocument.cs
- cookiecollection.cs
- AdapterUtil.cs
- Timeline.cs
- DuplicateWaitObjectException.cs
- Msec.cs
- SecurityHeaderElementInferenceEngine.cs
- TypeLibConverter.cs
- AuthenticationException.cs
- NestedContainer.cs
- XmlElementCollection.cs
- TextPointer.cs
- ExpressionVisitor.cs
- KnowledgeBase.cs
- StyleSelector.cs
- dbenumerator.cs
- StorageMappingFragment.cs
- ParameterSubsegment.cs
- XmlSchemaSimpleContentExtension.cs
- DynamicMethod.cs
- CompareInfo.cs
- querybuilder.cs
- Base64Stream.cs
- OperatorExpressions.cs
- SimpleWebHandlerParser.cs
- CustomMenuItemCollection.cs
- MenuItemStyle.cs
- XhtmlBasicPhoneCallAdapter.cs
- CodeTypeDeclarationCollection.cs
- MapPathBasedVirtualPathProvider.cs
- WebPartConnection.cs
- CultureInfoConverter.cs
- EntityDataSourceViewSchema.cs
- CannotUnloadAppDomainException.cs
- BindingExpressionBase.cs
- SafeCryptContextHandle.cs
- ExtensionQuery.cs
- SmiEventStream.cs
- _RequestCacheProtocol.cs
- WebHeaderCollection.cs
- OleDbErrorCollection.cs
- PasswordBoxAutomationPeer.cs
- EmptyQuery.cs
- ConfigurationException.cs
- UInt32.cs
- DetectRunnableInstancesTask.cs
- MaskedTextBox.cs
- XsltArgumentList.cs
- EntityEntry.cs
- FastEncoderWindow.cs
- SmtpDigestAuthenticationModule.cs
- CollectionType.cs
- Schedule.cs
- BroadcastEventHelper.cs
- ToolZone.cs
- GraphicsPathIterator.cs
- FontResourceCache.cs
- EdmFunctions.cs
- InputBindingCollection.cs
- ToolStripOverflow.cs
- ZipIOExtraFieldPaddingElement.cs
- ProfilePropertyNameValidator.cs
- ConfigXmlText.cs
- DateTimeParse.cs
- WebConfigurationFileMap.cs
- PointF.cs
- MembershipUser.cs
- DataGridRowDetailsEventArgs.cs
- ParserOptions.cs
- ListViewGroupCollectionEditor.cs
- TraceUtility.cs
- FlowPosition.cs
- XPathException.cs
- ToolStripPanel.cs
- CellParaClient.cs
- DayRenderEvent.cs
- ReadWriteSpinLock.cs
- DataGridDefaultColumnWidthTypeConverter.cs
- SystemDiagnosticsSection.cs
- XmlILStorageConverter.cs