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
- Timeline.cs
- RequestCacheValidator.cs
- GregorianCalendarHelper.cs
- BamlRecordHelper.cs
- ExpressionNormalizer.cs
- XmlSerializerAssemblyAttribute.cs
- SerialPinChanges.cs
- UrlPath.cs
- ErrorWrapper.cs
- SerializationFieldInfo.cs
- IsolatedStorageFileStream.cs
- TemplatingOptionsDialog.cs
- ButtonFlatAdapter.cs
- SplitterPanel.cs
- RecognizeCompletedEventArgs.cs
- Transform.cs
- CodeCatchClauseCollection.cs
- OleDbParameter.cs
- RemotingSurrogateSelector.cs
- UrlPath.cs
- ListSortDescription.cs
- pingexception.cs
- SoundPlayer.cs
- Debug.cs
- HtmlTableCell.cs
- GregorianCalendarHelper.cs
- QueryRewriter.cs
- TextTreeTextNode.cs
- Boolean.cs
- FrameSecurityDescriptor.cs
- HttpChannelListener.cs
- PipeStream.cs
- IisTraceWebEventProvider.cs
- DPAPIProtectedConfigurationProvider.cs
- SmiMetaDataProperty.cs
- TemplatePropertyEntry.cs
- FormViewPageEventArgs.cs
- DataGridViewColumnEventArgs.cs
- GcHandle.cs
- MonthChangedEventArgs.cs
- EventSetter.cs
- MetadataResolver.cs
- ErrorHandlerFaultInfo.cs
- AlphaSortedEnumConverter.cs
- ClientTarget.cs
- FormViewUpdatedEventArgs.cs
- ServiceModelReg.cs
- RootBrowserWindow.cs
- OutOfProcStateClientManager.cs
- WebPartConnectionsEventArgs.cs
- BinaryMethodMessage.cs
- LinkClickEvent.cs
- OutOfProcStateClientManager.cs
- JournalNavigationScope.cs
- QueryStringParameter.cs
- TreeNodeBindingCollection.cs
- CreateUserErrorEventArgs.cs
- HttpProcessUtility.cs
- MetadataSerializer.cs
- LocalizationParserHooks.cs
- UIHelper.cs
- XhtmlBasicTextViewAdapter.cs
- CollectionView.cs
- TemplatedMailWebEventProvider.cs
- DetailsViewModeEventArgs.cs
- SQLDateTime.cs
- FontEmbeddingManager.cs
- DecimalAnimationUsingKeyFrames.cs
- NameValueConfigurationElement.cs
- CroppedBitmap.cs
- DynamicQueryableWrapper.cs
- EventProxy.cs
- NameSpaceExtractor.cs
- SynchronizationContext.cs
- ClientUtils.cs
- TrackingDataItemValue.cs
- CodeTypeParameterCollection.cs
- InfiniteIntConverter.cs
- X509Extension.cs
- TreeNodeEventArgs.cs
- MaskedTextBox.cs
- XmlNotation.cs
- SourceFilter.cs
- CellParagraph.cs
- DynamicResourceExtension.cs
- ReceiveMessageContent.cs
- WindowsListView.cs
- DetailsViewRow.cs
- Enumerable.cs
- TerminatingOperationBehavior.cs
- ZoneButton.cs
- PagedDataSource.cs
- BamlRecords.cs
- CryptoHandle.cs
- WebConfigManager.cs
- ProcessModelSection.cs
- RepeatBehavior.cs
- Component.cs
- SkipQueryOptionExpression.cs
- SupportingTokenChannel.cs