Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Services / Messaging / System / Messaging / XmlMessageFormatter.cs / 1305376 / XmlMessageFormatter.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Messaging {
using System;
using System.IO;
using System.Xml;
using System.Collections;
using System.Xml.Serialization;
using System.ComponentModel;
using System.Security.Permissions;
///
///
/// Formatter class that serializes and deserializes objects into
/// and from MessageQueue messages using Xml.
///
public class XmlMessageFormatter : IMessageFormatter {
private Type[] targetTypes;
private string[] targetTypeNames;
Hashtable targetSerializerTable = new Hashtable();
private bool typeNamesAdded;
private bool typesAdded;
///
///
/// Creates a new Xml message formatter object.
///
public XmlMessageFormatter() {
this.TargetTypes = new Type[0];
this.TargetTypeNames = new string[0];
}
///
///
/// Creates a new Xml message formatter object,
/// using the given properties.
///
public XmlMessageFormatter(string[] targetTypeNames) {
this.TargetTypeNames = targetTypeNames;
this.TargetTypes = new Type[0];
}
///
///
/// Creates a new Xml message formatter object,
/// using the given properties.
///
public XmlMessageFormatter(Type[] targetTypes) {
this.TargetTypes = targetTypes;
this.TargetTypeNames = new string[0];
}
///
///
/// Specifies the set of possible types that will
/// be deserialized by the formatter from the
/// message provided.
///
[MessagingDescription(Res.XmlMsgTargetTypeNames)]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public string[] TargetTypeNames {
get {
return this.targetTypeNames;
}
set {
if (value == null)
throw new ArgumentNullException("value");
this.typeNamesAdded = false;
this.targetTypeNames = value;
}
}
///
///
/// Specifies the set of possible types that will
/// be deserialized by the formatter from the
/// message provided.
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), MessagingDescription(Res.XmlMsgTargetTypes)]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public Type[] TargetTypes {
get {
return this.targetTypes;
}
set {
if (value == null)
throw new ArgumentNullException("value");
this.typesAdded = false;
this.targetTypes = value;
}
}
///
///
/// When this method is called, the formatter will attempt to determine
/// if the contents of the message are something the formatter can deal with.
///
public bool CanRead(Message message) {
if (message == null)
throw new ArgumentNullException("message");
this.CreateTargetSerializerTable();
Stream stream = message.BodyStream;
XmlTextReader reader = new XmlTextReader(stream);
reader.WhitespaceHandling = WhitespaceHandling.Significant;
reader.DtdProcessing = DtdProcessing.Prohibit;
bool result = false;
foreach (XmlSerializer serializer in targetSerializerTable.Values) {
if (serializer.CanDeserialize(reader)) {
result = true;
break;
}
}
message.BodyStream.Position = 0; // reset stream in case CanRead is followed by Deserialize
return result;
}
///
///
/// This method is needed to improve scalability on Receive and ReceiveAsync scenarios. Not requiring
/// thread safety on read and write.
///
public object Clone() {
XmlMessageFormatter formatter = new XmlMessageFormatter();
formatter.targetTypes = targetTypes;
formatter.targetTypeNames = targetTypeNames;
formatter.typesAdded = typesAdded;
formatter.typeNamesAdded = typeNamesAdded;
foreach (Type targetType in targetSerializerTable.Keys)
formatter.targetSerializerTable[targetType] = new XmlSerializer(targetType);
return formatter;
}
///
private void CreateTargetSerializerTable() {
if (!this.typeNamesAdded) {
for (int index = 0; index < this.targetTypeNames.Length; ++ index) {
Type targetType = Type.GetType(this.targetTypeNames[index], true);
if (targetType != null)
this.targetSerializerTable[targetType] = new XmlSerializer(targetType);
}
this.typeNamesAdded = true;
}
if (!this.typesAdded) {
for (int index = 0; index < this.targetTypes.Length; ++ index)
this.targetSerializerTable[this.targetTypes[index]] = new XmlSerializer(this.targetTypes[index]);
this.typesAdded = true;
}
if (this.targetSerializerTable.Count == 0)
throw new InvalidOperationException(Res.GetString(Res.TypeListMissing));
}
///
///
/// This method is used to read the contents from the given message
/// and create an object.
///
public object Read(Message message) {
if (message == null)
throw new ArgumentNullException("message");
this.CreateTargetSerializerTable();
Stream stream = message.BodyStream;
XmlTextReader reader = new XmlTextReader(stream);
reader.WhitespaceHandling = WhitespaceHandling.Significant;
reader.DtdProcessing = DtdProcessing.Prohibit;
foreach (XmlSerializer serializer in targetSerializerTable.Values) {
if (serializer.CanDeserialize(reader))
return serializer.Deserialize(reader);
}
throw new InvalidOperationException(Res.GetString(Res.InvalidTypeDeserialization));
}
///
///
/// This method is used to write the given object into the given message.
/// If the formatter cannot understand the given object, an exception is thrown.
///
public void Write(Message message, object obj) {
if (message == null)
throw new ArgumentNullException("message");
if (obj == null)
throw new ArgumentNullException("obj");
Stream stream = new MemoryStream();
Type serializedType = obj.GetType();
XmlSerializer serializer = null;
if (this.targetSerializerTable.ContainsKey(serializedType))
serializer = (XmlSerializer)this.targetSerializerTable[serializedType];
else {
serializer = new XmlSerializer(serializedType);
this.targetSerializerTable[serializedType] = serializer;
}
serializer.Serialize(stream, obj);
message.BodyStream = stream;
//Need to reset the body type, in case the same message
//is reused by some other formatter.
message.BodyType = 0;
}
}
}
// 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
- ValueChangedEventManager.cs
- NumberFormatInfo.cs
- COM2ColorConverter.cs
- SecurityListenerSettingsLifetimeManager.cs
- WebSysDefaultValueAttribute.cs
- ToolStripLabel.cs
- RunWorkerCompletedEventArgs.cs
- ServiceNameCollection.cs
- MarkupCompilePass1.cs
- OutputCacheProfile.cs
- ParseElement.cs
- Run.cs
- MaskedTextProvider.cs
- DXD.cs
- MgmtConfigurationRecord.cs
- Pair.cs
- PointCollection.cs
- SafeReversePInvokeHandle.cs
- GenericIdentity.cs
- DocumentXmlWriter.cs
- PathGeometry.cs
- ComAdminInterfaces.cs
- EUCJPEncoding.cs
- XmlSchemaImport.cs
- RectAnimationBase.cs
- Grid.cs
- MsmqBindingFilter.cs
- NullableFloatMinMaxAggregationOperator.cs
- FilterQuery.cs
- TextBoxBase.cs
- TabletCollection.cs
- SqlColumnizer.cs
- sqlnorm.cs
- SpinLock.cs
- InkCanvasAutomationPeer.cs
- RsaKeyIdentifierClause.cs
- CheckBoxPopupAdapter.cs
- ButtonChrome.cs
- DSASignatureFormatter.cs
- RotateTransform3D.cs
- SHA512Managed.cs
- UIElement.cs
- ExpressionBinding.cs
- XmlSchemaAppInfo.cs
- TextTrailingWordEllipsis.cs
- BaseServiceProvider.cs
- RepeatButton.cs
- _AuthenticationState.cs
- ExpressionConverter.cs
- EventWaitHandleSecurity.cs
- DirectionalLight.cs
- GenericAuthenticationEventArgs.cs
- Focus.cs
- VisualStyleTypesAndProperties.cs
- ListBox.cs
- DefaultTraceListener.cs
- XPathDocument.cs
- WebPartTransformerAttribute.cs
- Page.cs
- XmlUtil.cs
- ConnectionManagementElementCollection.cs
- HtmlFormWrapper.cs
- ChameleonKey.cs
- Quaternion.cs
- GenericPrincipal.cs
- BuildProviderAppliesToAttribute.cs
- NumberFormatter.cs
- DataServiceRequestException.cs
- Int32Animation.cs
- DataGridHelper.cs
- WindowsEditBoxRange.cs
- AdPostCacheSubstitution.cs
- _NegoStream.cs
- XmlSerializerFormatAttribute.cs
- EqualityArray.cs
- DropDownList.cs
- ContainerAction.cs
- SqlServer2KCompatibilityAnnotation.cs
- StrongNamePublicKeyBlob.cs
- FixedSOMPage.cs
- UrlMappingsModule.cs
- XomlCompilerError.cs
- SapiRecoContext.cs
- ProcessModelInfo.cs
- DefaultValueMapping.cs
- Unit.cs
- DrawingContextDrawingContextWalker.cs
- RewritingProcessor.cs
- URLAttribute.cs
- SmtpReplyReaderFactory.cs
- LinkLabel.cs
- NativeMethods.cs
- CheckBoxAutomationPeer.cs
- MILUtilities.cs
- VirtualizingStackPanel.cs
- RegexMatch.cs
- StaticSiteMapProvider.cs
- SourceFilter.cs
- ZipArchive.cs
- ParserContext.cs