Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / Serialization / System / Runtime / Serialization / Json / JsonClassDataContract.cs / 1305376 / 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
{
[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]
JsonClassDataContractCriticalHelper helper;
[Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
Safe = "Doesn't leak anything.")]
[SecuritySafeCritical]
public JsonClassDataContract(ClassDataContract traditionalDataContract) : base(new JsonClassDataContractCriticalHelper(traditionalDataContract))
{
this.helper = base.Helper as JsonClassDataContractCriticalHelper;
}
internal JsonFormatClassReaderDelegate 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)
{
JsonFormatClassReaderDelegate tempDelegate = new JsonFormatReaderGenerator().GenerateClassReader(TraditionalClassDataContract);
Thread.MemoryBarrier();
helper.JsonFormatReaderDelegate = tempDelegate;
}
}
}
return helper.JsonFormatReaderDelegate;
}
}
internal JsonFormatClassWriterDelegate 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)
{
JsonFormatClassWriterDelegate tempDelegate = new JsonFormatWriterGenerator().GenerateClassWriter(TraditionalClassDataContract);
Thread.MemoryBarrier();
helper.JsonFormatWriterDelegate = tempDelegate;
}
}
}
return helper.JsonFormatWriterDelegate;
}
}
internal XmlDictionaryString[] MemberNames
{
[Fx.Tag.SecurityNote(Critical = "Fetches the critical MemberNames property.",
Safe = "MemberNames only needs to be protected for write.")]
[SecuritySafeCritical]
get { return this.helper.MemberNames; }
}
internal override string TypeName
{
[Fx.Tag.SecurityNote(Critical = "Fetches the critical TypeName property.",
Safe = "TypeName only needs to be protected for write.")]
[SecuritySafeCritical]
get { return this.helper.TypeName; }
}
ClassDataContract TraditionalClassDataContract
{
[Fx.Tag.SecurityNote(Critical = "Fetches the critical TraditionalClassDataContract property.",
Safe = "TraditionalClassDataContract only needs to be protected for write.")]
[SecuritySafeCritical]
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);
}
[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 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;
Dictionary memberTable = new Dictionary(memberCount);
XmlDictionaryString[] decodedMemberNames = new XmlDictionaryString[memberCount];
for (int i = 0; i < memberCount; i++)
{
if (memberTable.ContainsKey(traditionalClassDataContract.MemberNames[i].Value))
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SerializationException(SR.GetString(SR.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.
//---------------------------------------------------------------
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
{
[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]
JsonClassDataContractCriticalHelper helper;
[Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
Safe = "Doesn't leak anything.")]
[SecuritySafeCritical]
public JsonClassDataContract(ClassDataContract traditionalDataContract) : base(new JsonClassDataContractCriticalHelper(traditionalDataContract))
{
this.helper = base.Helper as JsonClassDataContractCriticalHelper;
}
internal JsonFormatClassReaderDelegate 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)
{
JsonFormatClassReaderDelegate tempDelegate = new JsonFormatReaderGenerator().GenerateClassReader(TraditionalClassDataContract);
Thread.MemoryBarrier();
helper.JsonFormatReaderDelegate = tempDelegate;
}
}
}
return helper.JsonFormatReaderDelegate;
}
}
internal JsonFormatClassWriterDelegate 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)
{
JsonFormatClassWriterDelegate tempDelegate = new JsonFormatWriterGenerator().GenerateClassWriter(TraditionalClassDataContract);
Thread.MemoryBarrier();
helper.JsonFormatWriterDelegate = tempDelegate;
}
}
}
return helper.JsonFormatWriterDelegate;
}
}
internal XmlDictionaryString[] MemberNames
{
[Fx.Tag.SecurityNote(Critical = "Fetches the critical MemberNames property.",
Safe = "MemberNames only needs to be protected for write.")]
[SecuritySafeCritical]
get { return this.helper.MemberNames; }
}
internal override string TypeName
{
[Fx.Tag.SecurityNote(Critical = "Fetches the critical TypeName property.",
Safe = "TypeName only needs to be protected for write.")]
[SecuritySafeCritical]
get { return this.helper.TypeName; }
}
ClassDataContract TraditionalClassDataContract
{
[Fx.Tag.SecurityNote(Critical = "Fetches the critical TraditionalClassDataContract property.",
Safe = "TraditionalClassDataContract only needs to be protected for write.")]
[SecuritySafeCritical]
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);
}
[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 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;
Dictionary memberTable = new Dictionary(memberCount);
XmlDictionaryString[] decodedMemberNames = new XmlDictionaryString[memberCount];
for (int i = 0; i < memberCount; i++)
{
if (memberTable.ContainsKey(traditionalClassDataContract.MemberNames[i].Value))
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SerializationException(SR.GetString(SR.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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DesignerGenericWebPart.cs
- PropertyConverter.cs
- DependsOnAttribute.cs
- QilFactory.cs
- BrowserCapabilitiesFactory.cs
- TriggerAction.cs
- InvalidCastException.cs
- ArraySortHelper.cs
- DecoratedNameAttribute.cs
- FixedFindEngine.cs
- BitmapData.cs
- EmptyStringExpandableObjectConverter.cs
- BulletChrome.cs
- ProcessModelSection.cs
- GeneralTransform.cs
- BitFlagsGenerator.cs
- CachedRequestParams.cs
- DataGrid.cs
- SQLMoneyStorage.cs
- SafeFileMapViewHandle.cs
- DefaultDiscoveryService.cs
- EnglishPluralizationService.cs
- EncodingFallbackAwareXmlTextWriter.cs
- ActivationArguments.cs
- MarkupExtensionParser.cs
- ListManagerBindingsCollection.cs
- CompressionTransform.cs
- DesignerOptions.cs
- AttachedPropertyDescriptor.cs
- EntityDataSourceSelectedEventArgs.cs
- WindowsTreeView.cs
- FixedPageStructure.cs
- _LazyAsyncResult.cs
- CacheMemory.cs
- XmlDownloadManager.cs
- SqlAggregateChecker.cs
- MouseActionConverter.cs
- GridErrorDlg.cs
- DispatcherExceptionFilterEventArgs.cs
- HttpModuleActionCollection.cs
- ColumnResult.cs
- XamlReader.cs
- DesignerActionHeaderItem.cs
- RemotingClientProxy.cs
- ProgressChangedEventArgs.cs
- Slider.cs
- WorkItem.cs
- PropertyChangingEventArgs.cs
- bidPrivateBase.cs
- GenericAuthenticationEventArgs.cs
- Transform3D.cs
- BuildResultCache.cs
- Point3DIndependentAnimationStorage.cs
- TablePattern.cs
- AssertFilter.cs
- QilGenerator.cs
- MetafileHeaderWmf.cs
- SqlUtil.cs
- ChannelCacheDefaults.cs
- PolicyVersionConverter.cs
- DataGridViewSelectedRowCollection.cs
- DataGridViewCellStyleChangedEventArgs.cs
- ImageButton.cs
- EventLogPermission.cs
- IsolatedStorageException.cs
- SiteMapHierarchicalDataSourceView.cs
- ActivityStateRecord.cs
- Internal.cs
- MethodCallTranslator.cs
- HtmlTitle.cs
- ResourceAttributes.cs
- SqlFlattener.cs
- CodePropertyReferenceExpression.cs
- OrderByExpression.cs
- TreePrinter.cs
- ChildTable.cs
- TaiwanCalendar.cs
- WebPartManagerInternals.cs
- PanelDesigner.cs
- CodeEntryPointMethod.cs
- InkPresenterAutomationPeer.cs
- MediaElement.cs
- TreeIterator.cs
- RegisteredScript.cs
- ToolStripLabel.cs
- CodeVariableReferenceExpression.cs
- MessageSecurityVersionConverter.cs
- PenThread.cs
- LocalFileSettingsProvider.cs
- BitmapMetadataBlob.cs
- BasicExpressionVisitor.cs
- CustomLineCap.cs
- EncodingDataItem.cs
- WebReferencesBuildProvider.cs
- Mapping.cs
- Emitter.cs
- AppModelKnownContentFactory.cs
- _KerberosClient.cs
- NavigationService.cs
- DataGridViewAutoSizeColumnModeEventArgs.cs