Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / System / data / design / PropertyReferenceSerializer.cs / 1 / PropertyReferenceSerializer.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All Rights Reserved. // Information Contained Herein is Proprietary and Confidential. // //----------------------------------------------------------------------------- namespace System.Data.Design { using System; using System.CodeDom; using System.CodeDom.Compiler; using System.IO; using System.Text; using System.Diagnostics; using System.Runtime.Serialization; ////// internal class PropertyReferenceSerializer { private const string applicationSettingsPrefix = "ApplicationSettings"; private const string appConfigPrefix = "AppConfig"; // private constructor to avoid class being instantiated. private PropertyReferenceSerializer() { } internal static string Serialize(CodePropertyReferenceExpression expression) { if (IsWellKnownApplicationSettingsExpression(expression)) { return SerializeApplicationSettingsExpression(expression); } if (IsWellKnownAppConfigExpression(expression)) { return SerializeAppConfigExpression(expression); } Debug.Assert(false, "Unable to recognize Connection Property Reference for serialization, falling back to SOAPFormatter."); return SerializeWithSoapFormatter(expression); } internal static CodePropertyReferenceExpression Deserialize(string expressionString) { string[] expressionParts = expressionString.Split('.'); if (expressionParts != null && expressionParts.Length > 0) { if (StringUtil.EqualValue(expressionParts[0], applicationSettingsPrefix)) { return DeserializeApplicationSettingsExpression(expressionParts); } if (StringUtil.EqualValue(expressionParts[0], appConfigPrefix)) { return DeserializeAppConfigExpression(expressionParts); } } // if our custom deserialization failed, fall back to the SOAP Formatter; this will also provide backward compatibility // with Beta2 UTF8Encoding encoding = new UTF8Encoding(); MemoryStream stream = new MemoryStream(encoding.GetBytes(expressionString)); IFormatter formatter = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter(); return (CodePropertyReferenceExpression)formatter.Deserialize(stream); } private static string SerializeWithSoapFormatter(CodePropertyReferenceExpression expression) { MemoryStream stream = new MemoryStream(); IFormatter formatter = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter(); formatter.Serialize(stream, expression); if (stream.Length > (long)int.MaxValue) { throw new InternalException("Serialized property expression is too long."); } UTF8Encoding encoding = new UTF8Encoding(); byte[] buffer = new byte[stream.Length]; stream.Position = 0; stream.Read(buffer, 0, (int)stream.Length); return encoding.GetString(buffer); } private static string SerializeApplicationSettingsExpression(CodePropertyReferenceExpression expression) { string serializationString = expression.PropertyName; CodePropertyReferenceExpression targetObject = (CodePropertyReferenceExpression)expression.TargetObject; serializationString = targetObject.PropertyName + "." + serializationString; CodeTypeReferenceExpression typeReference = (CodeTypeReferenceExpression)targetObject.TargetObject; serializationString = typeReference.Type.Options.ToString() + "." + serializationString; serializationString = typeReference.Type.BaseType + "." + serializationString; serializationString = applicationSettingsPrefix + "." + serializationString; return serializationString; } private static string SerializeAppConfigExpression(CodePropertyReferenceExpression expression) { string serializationString = expression.PropertyName; CodeIndexerExpression targetObject = (CodeIndexerExpression)expression.TargetObject; string indexValue = ((CodePrimitiveExpression)targetObject.Indices[0]).Value as string; serializationString = indexValue + "." + serializationString; CodePropertyReferenceExpression indexTarget = (CodePropertyReferenceExpression)targetObject.TargetObject; serializationString = indexTarget.PropertyName + "." + serializationString; CodeTypeReferenceExpression typeReference = (CodeTypeReferenceExpression)indexTarget.TargetObject; serializationString = typeReference.Type.Options.ToString() + "." + serializationString; serializationString = typeReference.Type.BaseType + "." + serializationString; serializationString = appConfigPrefix + "." + serializationString; return serializationString; } private static bool IsWellKnownApplicationSettingsExpression(CodePropertyReferenceExpression expression) { if (expression.UserData != null && expression.UserData.Count > 0) { return false; } if (!(expression.TargetObject is CodePropertyReferenceExpression)) { return false; } CodePropertyReferenceExpression targetObject = (CodePropertyReferenceExpression)expression.TargetObject; if (targetObject.UserData != null && targetObject.UserData.Count > 0) { return false; } if (!(targetObject.TargetObject is CodeTypeReferenceExpression)) { return false; } CodeTypeReferenceExpression typeReference = (CodeTypeReferenceExpression)targetObject.TargetObject; if (typeReference.UserData != null && typeReference.UserData.Count > 0) { return false; } CodeTypeReference type = typeReference.Type; if (type.UserData != null && type.UserData.Count > 0) { return false; } if (type.TypeArguments != null && type.TypeArguments.Count > 0) { return false; } if (type.ArrayElementType != null || type.ArrayRank > 0) { return false; } return true; } private static bool IsWellKnownAppConfigExpression(CodePropertyReferenceExpression expression) { if (expression.UserData != null && expression.UserData.Count > 0) { return false; } if (!(expression.TargetObject is CodeIndexerExpression)) { return false; } CodeIndexerExpression targetObject = (CodeIndexerExpression)expression.TargetObject; if (targetObject.UserData != null && targetObject.UserData.Count > 0) { return false; } if (targetObject.Indices == null || targetObject.Indices.Count != 1 || !(targetObject.Indices[0] is CodePrimitiveExpression)) { return false; } if (!(((CodePrimitiveExpression)targetObject.Indices[0]).Value is string)) { return false; } if (!(targetObject.TargetObject is CodePropertyReferenceExpression)) { return false; } CodePropertyReferenceExpression indexTarget = (CodePropertyReferenceExpression)targetObject.TargetObject; if (indexTarget.UserData != null && indexTarget.UserData.Count > 0) { return false; } if (!(indexTarget.TargetObject is CodeTypeReferenceExpression)) { return false; } CodeTypeReferenceExpression typeReference = (CodeTypeReferenceExpression)indexTarget.TargetObject; if (typeReference.UserData != null && typeReference.UserData.Count > 0) { return false; } CodeTypeReference type = typeReference.Type; if (type.UserData != null && type.UserData.Count > 0) { return false; } if (type.TypeArguments != null && type.TypeArguments.Count > 0) { return false; } if (type.ArrayElementType != null || type.ArrayRank > 0) { return false; } return true; } private static CodePropertyReferenceExpression DeserializeApplicationSettingsExpression(string[] expressionParts) { int currentPart = expressionParts.Length - 1; CodePropertyReferenceExpression outerExpression = new CodePropertyReferenceExpression(); outerExpression.PropertyName = expressionParts[currentPart]; currentPart--; CodePropertyReferenceExpression targetObject = new CodePropertyReferenceExpression(); outerExpression.TargetObject = targetObject; targetObject.PropertyName = expressionParts[currentPart]; currentPart--; CodeTypeReferenceExpression targetType = new CodeTypeReferenceExpression(); targetObject.TargetObject = targetType; targetType.Type.Options = (CodeTypeReferenceOptions)Enum.Parse(typeof(CodeTypeReferenceOptions), expressionParts[currentPart]); currentPart--; targetType.Type.BaseType = expressionParts[currentPart]; currentPart--; while (currentPart > 0) { targetType.Type.BaseType = expressionParts[currentPart] + "." + targetType.Type.BaseType; currentPart--; } return outerExpression; } private static CodePropertyReferenceExpression DeserializeAppConfigExpression(string[] expressionParts) { int currentPart = expressionParts.Length - 1; CodePropertyReferenceExpression outerExpression = new CodePropertyReferenceExpression(); outerExpression.PropertyName = expressionParts[currentPart]; currentPart--; CodeIndexerExpression indexerExpression = new CodeIndexerExpression(); outerExpression.TargetObject = indexerExpression; indexerExpression.Indices.Add(new CodePrimitiveExpression(expressionParts[currentPart])); currentPart--; CodePropertyReferenceExpression indexTarget = new CodePropertyReferenceExpression(); indexerExpression.TargetObject = indexTarget; indexTarget.PropertyName = expressionParts[currentPart]; currentPart--; CodeTypeReferenceExpression targetType = new CodeTypeReferenceExpression(); indexTarget.TargetObject = targetType; targetType.Type.Options = (CodeTypeReferenceOptions)Enum.Parse(typeof(CodeTypeReferenceOptions), expressionParts[currentPart]); currentPart--; targetType.Type.BaseType = expressionParts[currentPart]; currentPart--; while (currentPart > 0) { targetType.Type.BaseType = expressionParts[currentPart] + "." + targetType.Type.BaseType; currentPart--; } return outerExpression; } } } // 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
- IntersectQueryOperator.cs
- XamlLoadErrorInfo.cs
- Stopwatch.cs
- NestedContainer.cs
- TrackingCondition.cs
- AttributeParameterInfo.cs
- XmlChildEnumerator.cs
- TagElement.cs
- TransformPatternIdentifiers.cs
- ResourceReferenceKeyNotFoundException.cs
- SmtpClient.cs
- ChameleonKey.cs
- ParameterToken.cs
- SqlRetyper.cs
- ObjectItemLoadingSessionData.cs
- Label.cs
- VectorAnimation.cs
- MouseEventArgs.cs
- SqlPersonalizationProvider.cs
- XmlSchemaSimpleContent.cs
- StateMachineDesignerPaint.cs
- AppearanceEditorPart.cs
- SessionSwitchEventArgs.cs
- TextParagraphView.cs
- documentsequencetextcontainer.cs
- ProfileWorkflowElement.cs
- PropertyGrid.cs
- InternalUserCancelledException.cs
- DesignBindingConverter.cs
- ScriptManagerProxy.cs
- OracleDataAdapter.cs
- GlobalizationAssembly.cs
- ResolveNameEventArgs.cs
- CustomAttributeBuilder.cs
- XmlAttributes.cs
- GradientBrush.cs
- GroupPartitionExpr.cs
- ScrollChrome.cs
- Emitter.cs
- Filter.cs
- FlowDocumentPaginator.cs
- PointCollection.cs
- FamilyTypefaceCollection.cs
- RectKeyFrameCollection.cs
- ConcurrentQueue.cs
- Encoding.cs
- SHA384.cs
- HScrollBar.cs
- SqlDependency.cs
- WebResourceAttribute.cs
- ListViewPagedDataSource.cs
- DesignerView.cs
- StructuralObject.cs
- HwndHost.cs
- RelationshipType.cs
- DataColumnMapping.cs
- TemplateBuilder.cs
- HttpCachePolicy.cs
- HwndAppCommandInputProvider.cs
- WebPartUserCapability.cs
- XmlCharacterData.cs
- PropertyGrid.cs
- _IPv4Address.cs
- IdentityModelStringsVersion1.cs
- DelegatedStream.cs
- ImageSource.cs
- CodeTryCatchFinallyStatement.cs
- CallId.cs
- InvokePattern.cs
- DataGridCellInfo.cs
- CompilerError.cs
- XmlUtil.cs
- ClientRoleProvider.cs
- PropertyManager.cs
- XmlSchemaComplexContent.cs
- TableRowCollection.cs
- MSG.cs
- EastAsianLunisolarCalendar.cs
- SudsWriter.cs
- CompatibleIComparer.cs
- ColumnHeader.cs
- DbConnectionClosed.cs
- XsltInput.cs
- SAPIEngineTypes.cs
- DateTimeUtil.cs
- TextModifier.cs
- BitmapEffectGroup.cs
- LineUtil.cs
- ObjectStateEntryDbUpdatableDataRecord.cs
- PropertyMetadata.cs
- DoubleLinkListEnumerator.cs
- WebPartCatalogAddVerb.cs
- FocusManager.cs
- CodeIdentifier.cs
- OracleDateTime.cs
- UrlPath.cs
- Attributes.cs
- TableLayoutSettings.cs
- SqlCacheDependencyDatabase.cs
- SortedDictionary.cs