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
- xmlfixedPageInfo.cs
- StyleModeStack.cs
- ZipFileInfoCollection.cs
- RuntimeArgumentHandle.cs
- HttpListenerRequest.cs
- TargetInvocationException.cs
- XamlPointCollectionSerializer.cs
- ManipulationStartedEventArgs.cs
- InheritanceContextChangedEventManager.cs
- WebPartEventArgs.cs
- EventLogger.cs
- TrackingQueryElement.cs
- DynamicMetaObject.cs
- Models.cs
- NotSupportedException.cs
- InvalidWMPVersionException.cs
- ObjectQueryState.cs
- DataGridViewColumnCollectionDialog.cs
- XPathParser.cs
- XmlStreamNodeWriter.cs
- EdmComplexPropertyAttribute.cs
- HtmlTable.cs
- WebPartTransformerAttribute.cs
- SymmetricKeyWrap.cs
- propertyentry.cs
- ListViewCommandEventArgs.cs
- DelegateCompletionCallbackWrapper.cs
- GuidTagList.cs
- TdsParserSafeHandles.cs
- DataGridViewHeaderCell.cs
- ColumnResizeUndoUnit.cs
- UTF8Encoding.cs
- ValidationEventArgs.cs
- ImageButton.cs
- Animatable.cs
- IApplicationTrustManager.cs
- ProfessionalColorTable.cs
- AVElementHelper.cs
- TablePattern.cs
- SimpleHandlerFactory.cs
- CalendarModeChangedEventArgs.cs
- JournalEntry.cs
- WebReferencesBuildProvider.cs
- Size.cs
- PropertyValueChangedEvent.cs
- SqlTypeSystemProvider.cs
- TextDataBindingHandler.cs
- SafeFindHandle.cs
- DataBoundControlHelper.cs
- DBNull.cs
- TableItemStyle.cs
- FontCollection.cs
- RenderDataDrawingContext.cs
- namescope.cs
- ElapsedEventArgs.cs
- TextServicesPropertyRanges.cs
- ItemsChangedEventArgs.cs
- PropertyTabAttribute.cs
- PixelFormat.cs
- WeakReadOnlyCollection.cs
- DomNameTable.cs
- Vector3D.cs
- versioninfo.cs
- VirtualizingStackPanel.cs
- MappingMetadataHelper.cs
- InheritanceContextChangedEventManager.cs
- ImageBrush.cs
- CngKeyBlobFormat.cs
- LoginDesigner.cs
- SmtpNegotiateAuthenticationModule.cs
- GradientStop.cs
- SkewTransform.cs
- XmlSchemaExporter.cs
- SelectionItemProviderWrapper.cs
- FixedSchema.cs
- Input.cs
- XmlPreloadedResolver.cs
- Rotation3D.cs
- EventMappingSettings.cs
- AutomationPropertyInfo.cs
- MethodInfo.cs
- ListMarkerLine.cs
- QueryOutputWriterV1.cs
- ControlPropertyNameConverter.cs
- MethodCallConverter.cs
- FormCollection.cs
- CompoundFileReference.cs
- PathFigureCollectionConverter.cs
- ServiceX509SecurityTokenProvider.cs
- SerializationSectionGroup.cs
- remotingproxy.cs
- ListItemParagraph.cs
- ArgIterator.cs
- HandleExceptionArgs.cs
- Compiler.cs
- ReadWriteObjectLock.cs
- X509SubjectKeyIdentifierClause.cs
- ItemsPresenter.cs
- DetailsView.cs
- SqlDataSourceCustomCommandPanel.cs