Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Print / Reach / Serialization / manager / ReachSerializerAsync.cs / 1 / ReachSerializerAsync.cs
/*++
Copyright (C) 2004- 2005 Microsoft Corporation
All rights reserved.
Module Name:
ReachSerializerAsync.cs
Abstract:
This file contains the definition of a Base class that defines
the common functionality required to serialie on type in a
graph of types rooted by some object instance
Author:
[....] ([....]) 25-May-2005
Revision History:
--*/
using System;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Diagnostics;
using System.Reflection;
using System.Xml;
using System.IO;
using System.Security;
using System.Security.Permissions;
using System.ComponentModel.Design.Serialization;
using System.Windows.Xps.Packaging;
using System.Windows.Documents;
using System.Windows.Media;
namespace System.Windows.Xps.Serialization
{
///
/// Base class defining common functionalities required to
/// serialize one type.
///
internal abstract class ReachSerializerAsync :
ReachSerializer
{
#region Constructor
///
/// Constructor for class ReachSerializer
///
///
/// The serializtion manager, the services of which are
/// used later for the serialization process of the type.
///
public
ReachSerializerAsync(
PackageSerializationManager manager
)
{
if(manager == null)
{
throw new ArgumentNullException("manager");
}
_serializationManager = manager as XpsSerializationManagerAsync;
if(_serializationManager == null)
{
throw new XpsSerializationException(ReachSR.Get(ReachSRID.ReachSerialization_NotXpsSerializationManagerAsync));
}
_xmlWriter = null;
}
#endregion Constructor
#region Public Methods
public
virtual
void
AsyncOperation(
ReachSerializerContext context
)
{
if(context == null)
{
}
switch (context.Action)
{
case SerializerAction.endSerializeObject:
{
EndSerializeObject(context.ObjectContext);
break;
}
case SerializerAction.serializeNextProperty:
{
SerializeNextProperty(context.ObjectContext);
break;
}
}
}
///
/// The main method that is called to serialize the object of
/// that given type.
///
///
/// Instance of object to be serialized.
///
public
override
void
SerializeObject(
Object serializedObject
)
{
BeginSerializeObject(serializedObject);
}
#endregion Public Methods
#region Internal Methods
///
/// The main method that is called to serialize the object of
/// that given type and that is usually called from within the
/// serialization manager when a node in the graph of objects is
/// at a turn where it should be serialized.
///
///
/// The context of the property being serialized at this time and
/// it points internally to the object encapsulated by that node.
///
internal
override
void
SerializeObject(
SerializablePropertyContext serializedProperty
)
{
BeginSerializeObject(serializedProperty);
}
///
/// Critical - Access the SerializationManager GraphContextStack which is a
/// ContextStack which is link critical
///
/// TreatAsSafe - The context stack is used local to the function.
/// All access to the GraphContextStack is marked security critical
///
[SecurityCritical, SecurityTreatAsSafe]
internal
virtual
void
BeginSerializeObject(
SerializablePropertyContext serializedProperty
)
{
if(serializedProperty == null)
{
throw new ArgumentNullException("serializedProperty");
}
if(SerializationManager == null)
{
throw new XpsSerializationException(ReachSR.Get(ReachSRID.ReachSerialization_MustHaveSerializationManager));
}
//
// At this stage discover the graph of properties of the object that
// need to be serialized
//
SerializableObjectContext serializableObjectContext = DiscoverObjectData(serializedProperty.Value,
serializedProperty);
if(serializableObjectContext!=null)
{
//
// Push the object at hand on the context stack
//
SerializationManager.GraphContextStack.Push(serializableObjectContext);
ReachSerializerContext context = new ReachSerializerContext(this,
serializableObjectContext,
SerializerAction.endSerializeObject);
_serializationManager.OperationStack.Push(context);
//
// At this stage we should start streaming the markup representing the
// object graph to the corresponding destination
//
PersistObjectData(serializableObjectContext);
}
}
///
///
///
///
/// Critical - Access the SerializationManager GraphContextStack which is a
/// ContextStack which is link critical
///
/// TreatAsSafe - The context stack is used local to the function.
/// All access to the GraphContextStack is marked security critical
///
[SecurityCritical, SecurityTreatAsSafe]
internal
virtual
void
BeginSerializeObject(
Object serializedObject
)
{
if(serializedObject == null)
{
throw new ArgumentNullException("serializedObject");
}
if(SerializationManager == null)
{
throw new XpsSerializationException(ReachSR.Get(ReachSRID.ReachSerialization_MustHaveSerializationManager));
}
//
// At this stage discover the graph of properties of the object that
// need to be serialized
//
SerializableObjectContext serializableObjectContext = DiscoverObjectData(serializedObject,
null);
if(serializableObjectContext!=null)
{
//
// Push the object at hand on the context stack
//
SerializationManager.GraphContextStack.Push(serializableObjectContext);
ReachSerializerContext context = new ReachSerializerContext(this,
serializableObjectContext,
SerializerAction.endSerializeObject);
_serializationManager.OperationStack.Push(context);
//
// At this stage we should start streaming the markup representing the
// object graph to the corresponding destination
//
PersistObjectData(serializableObjectContext);
}
}
///
/// Critical - Access the SerializationManager GraphContextStack which is a
/// ContextStack which is link critical
///
/// TreatAsSafe - The context stack is used local to the function.
/// All access to the GraphContextStack is marked security critical
///
[SecurityCritical, SecurityTreatAsSafe]
internal
virtual
void
EndSerializeObject(
SerializableObjectContext serializableObjectContext
)
{
//
// Pop the object from the context stack
//
SerializationManager.GraphContextStack.Pop();
//
// Recycle the used SerializableObjectContext
//
SerializableObjectContext.RecycleContext(serializableObjectContext);
}
/*///
/// The method is called once the object data is discovered at that
/// point of the serialization process.
///
///
/// The context of the object to be serialized at this time.
///
internal
abstract
void
PersistObjectData(
SerializableObjectContext serializableObjectContext
);*/
///
///
///
internal
virtual
void
EndPersistObjectData(
)
{
//
// Do nothing in the base class
//
}
///
/// Serialize the properties within the object
/// context into METRO
///
///
/// Method follows these steps
/// 1. Serializes the instance as string content
/// if is not meant to be a complex value. Else ...
/// 2. Serialize Properties as attributes
/// 3. Serialize Complex Properties as separate parts
/// through calling separate serializers
/// Also this is the virtual to override custom attributes or
/// contents need to be serialized
///
///
/// The context of the object to be serialized at this time.
///
internal
override
void
SerializeObjectCore(
SerializableObjectContext serializableObjectContext
)
{
if (serializableObjectContext == null)
{
throw new ArgumentNullException("serializableObjectContext");
}
if (!serializableObjectContext.IsReadOnlyValue &&
serializableObjectContext.IsComplexValue)
{
SerializeProperties(serializableObjectContext);
}
}
///
/// This method is the one that writes out the attribute within
/// the xml stream when serializing simple properites.
///
///
/// The property that is to be serialized as an attribute at this time.
///
internal
override
void
WriteSerializedAttribute(
SerializablePropertyContext serializablePropertyContext
)
{
if(serializablePropertyContext == null)
{
throw new ArgumentNullException("serializablePropertyContext");
}
}
#endregion Internal Methods
#region Private Methods
///
/// This method is the one that parses down the object at hand
/// to discover all the properties that are expected to be serialized
/// at that object level.
/// the xml stream when serializing simple properties.
///
///
/// The instance of the object being serialized.
///
///
/// The instance of property on the parent object from which this
/// object stemmed. This could be null if this is the node object
/// or the object has no parent.
///
///
/// Critical - Access the SerializationManager GraphContextStack which is a
/// ContextStack which is link critical
///
/// TreatAsSafe - The context stack is used local to the function.
/// All access to the GraphContextStack is marked security critical
///
[SecurityCritical, SecurityTreatAsSafe]
private
SerializableObjectContext
DiscoverObjectData(
Object serializedObject,
SerializablePropertyContext serializedProperty
)
{
//
// Trying to figure out the parent of this node, which is at this stage
// the same node previously pushed on the stack or in other words it is
// the node that is currently on the top of the stack
//
SerializableObjectContext
serializableObjectParentContext = (SerializableObjectContext)SerializationManager.
GraphContextStack[typeof(SerializableObjectContext)];
//
// Create the context for the current object
//
SerializableObjectContext serializableObjectContext =
SerializableObjectContext.CreateContext(SerializationManager,
serializedObject,
serializableObjectParentContext,
serializedProperty);
//
// Set the root object to be serialized at the level of the SerializationManager
//
if(SerializationManager.RootSerializableObjectContext == null)
{
SerializationManager.RootSerializableObjectContext = serializableObjectContext;
}
return serializableObjectContext;
}
///
/// Trigger all properties serialization
///
private
void
SerializeProperties(
SerializableObjectContext serializableObjectContext
)
{
if (serializableObjectContext == null)
{
throw new ArgumentNullException("serializableObjectContext");
}
SerializablePropertyCollection propertyCollection = serializableObjectContext.PropertiesCollection;
if(propertyCollection!=null)
{
//for(propertyCollection.Reset();
// propertyCollection.MoveNext();)
//{
// SerializablePropertyContext serializablePropertyContext =
// (SerializablePropertyContext)propertyCollection.Current;
//
// if(serializablePropertyContext!=null)
// {
// SerializeProperty(serializablePropertyContext);
// }
//}
propertyCollection.Reset();
ReachSerializerContext context = new ReachSerializerContext(this,
serializableObjectContext,
SerializerAction.serializeNextProperty);
_serializationManager.OperationStack.Push(context);
}
}
private
void
SerializeNextProperty(
SerializableObjectContext serializableObjectContext
)
{
SerializablePropertyCollection propertyCollection = serializableObjectContext.PropertiesCollection;
if(propertyCollection.MoveNext())
{
SerializablePropertyContext serializablePropertyContext =
(SerializablePropertyContext)propertyCollection.Current;
if(serializablePropertyContext!=null)
{
ReachSerializerContext context = new ReachSerializerContext(this,
serializableObjectContext,
SerializerAction.serializeNextProperty);
_serializationManager.OperationStack.Push(context);
SerializeProperty(serializablePropertyContext);
}
}
}
///
/// Trigger serializing one property at a time.
///
private
void
SerializeProperty(
SerializablePropertyContext serializablePropertyContext
)
{
if(serializablePropertyContext == null)
{
throw new ArgumentNullException("serializablePropertyContext");
}
if(!serializablePropertyContext.IsComplex)
{
//
// Non-Complex Properties are serialized as attributes
//
WriteSerializedAttribute(serializablePropertyContext);
}
else
{
//
// Complex properties could be treated in different ways
// based on their type. Examples of that are:
//
//
//
ReachSerializer serializer = SerializationManager.GetSerializer(serializablePropertyContext.Value);
// If there is no serializer for this type, we won't serialize this property
if(serializer!=null)
{
serializer.SerializeObject(serializablePropertyContext);
}
}
}
#endregion Private Methods
#region Public Properties
///
/// Query / Set Xml Writer for the equivelan part
///
public
override
XmlWriter
XmlWriter
{
get
{
return _xmlWriter;
}
set
{
_xmlWriter = value;
}
}
///
/// Query the SerializationManager used by this serializer.
///
public
override
PackageSerializationManager
SerializationManager
{
get
{
return _serializationManager;
}
}
#endregion Public Properties
#region Private Data members
private
XpsSerializationManagerAsync _serializationManager;
private
XmlWriter _xmlWriter;
#endregion Private Data members
};
internal enum SerializerAction
{
endSerializeObject = 1,
endPersistObjectData = 2,
serializeNextProperty = 3,
serializeNextDocumentReference = 4,
serializeDocument = 5,
serializeNextPageContent = 6,
serializePage = 7,
endSerializeReachFixedPage = 8,
serializeNextUIElement = 9,
serializeNextTreeNode = 10,
serializeNextDocumentPage = 11,
endSerializeDocumentPage = 12
};
internal class ReachSerializerContext
{
public
ReachSerializerContext(
ReachSerializerAsync serializer,
SerializerAction action
)
{
this._action = action;
this._serializer = serializer;
this._objectContext = null;
}
public
ReachSerializerContext(
ReachSerializerAsync serializer,
SerializableObjectContext objectContext,
SerializerAction action
)
{
this._action = action;
this._serializer = serializer;
this._objectContext = objectContext;
}
public
virtual
SerializerAction
Action
{
get
{
return _action;
}
}
public
virtual
ReachSerializerAsync
Serializer
{
get
{
return _serializer;
}
}
public
virtual
SerializableObjectContext
ObjectContext
{
get
{
return _objectContext;
}
}
private
SerializerAction _action;
private
ReachSerializerAsync _serializer;
private
SerializableObjectContext _objectContext;
};
}
// 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
- PasswordTextNavigator.cs
- XmlSchemaGroupRef.cs
- PersonalizationDictionary.cs
- ResourceWriter.cs
- WebDescriptionAttribute.cs
- TargetInvocationException.cs
- DocComment.cs
- SR.cs
- EditBehavior.cs
- UntrustedRecipientException.cs
- AssemblyNameProxy.cs
- FilterQueryOptionExpression.cs
- HttpRawResponse.cs
- SessionIDManager.cs
- AnnouncementDispatcherAsyncResult.cs
- GeometryDrawing.cs
- WindowsIdentity.cs
- safelinkcollection.cs
- DetailsViewInsertedEventArgs.cs
- InfoCardX509Validator.cs
- dataSvcMapFileLoader.cs
- ZipIOZip64EndOfCentralDirectoryLocatorBlock.cs
- RemotingServices.cs
- HexParser.cs
- ApplicationManager.cs
- Input.cs
- ImageButton.cs
- ChameleonKey.cs
- Evidence.cs
- DataGridViewCellFormattingEventArgs.cs
- SmiSettersStream.cs
- CodeConstructor.cs
- Stack.cs
- CollectionMarkupSerializer.cs
- ClipboardProcessor.cs
- Serializer.cs
- _NestedMultipleAsyncResult.cs
- RandomNumberGenerator.cs
- SoapDocumentServiceAttribute.cs
- NotImplementedException.cs
- PageAdapter.cs
- CopyOfAction.cs
- PseudoWebRequest.cs
- OracleConnection.cs
- SubpageParagraph.cs
- QueryableDataSourceEditData.cs
- CultureMapper.cs
- CustomTypeDescriptor.cs
- ResourcesChangeInfo.cs
- AccessText.cs
- PingOptions.cs
- KeyboardEventArgs.cs
- Pair.cs
- Variable.cs
- NotifyIcon.cs
- ResolveInfo.cs
- MessageQueueAccessControlEntry.cs
- FixedPageAutomationPeer.cs
- InstanceDescriptor.cs
- AutoGeneratedFieldProperties.cs
- EncoderReplacementFallback.cs
- Rect.cs
- XmlLanguageConverter.cs
- RtfToXamlLexer.cs
- Translator.cs
- WindowsEditBox.cs
- ApplicationDirectoryMembershipCondition.cs
- CompareInfo.cs
- Span.cs
- UniqueSet.cs
- TransformPatternIdentifiers.cs
- XPathNodeList.cs
- InstanceDataCollection.cs
- SHA384Managed.cs
- QuaternionIndependentAnimationStorage.cs
- IdentifierElement.cs
- CharacterMetrics.cs
- XmlArrayAttribute.cs
- TransportConfigurationTypeElementCollection.cs
- DataGridGeneralPage.cs
- Visitors.cs
- SqlDataSourceStatusEventArgs.cs
- SingleStorage.cs
- FaultCallbackWrapper.cs
- SchemaElementDecl.cs
- RenderingEventArgs.cs
- DefaultObjectMappingItemCollection.cs
- ObjectAnimationBase.cs
- DataGridViewCellEventArgs.cs
- CatalogZone.cs
- RemoteWebConfigurationHost.cs
- FileSecurity.cs
- OutputCacheSection.cs
- Viewport2DVisual3D.cs
- DataGridItemCollection.cs
- TreeView.cs
- TimeSpanValidator.cs
- MergePropertyDescriptor.cs
- EventMappingSettings.cs
- handlecollector.cs