JsonCollectionDataContract.cs source code in C# .NET

Source code for the .NET framework in C#

                        

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

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK