| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- //------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.Runtime.Serialization
- {
- using System;
- using System.Collections;
- using System.Diagnostics;
- using System.Globalization;
- using System.IO;
- using System.Reflection;
- using System.Text;
- using System.Xml;
- using System.Collections.Generic;
- using System.Security;
- using System.Security.Permissions;
- using System.Runtime.CompilerServices;
- using System.Runtime.Serialization.Diagnostics.Application;
- #if USE_REFEMIT
- public class XmlObjectSerializerWriteContextComplex : XmlObjectSerializerWriteContext
- #else
- internal class XmlObjectSerializerWriteContextComplex : XmlObjectSerializerWriteContext
- #endif
- {
- protected IDataContractSurrogate dataContractSurrogate;
- SerializationMode mode;
- SerializationBinder binder;
- ISurrogateSelector surrogateSelector;
- StreamingContext streamingContext;
- Hashtable surrogateDataContracts;
- internal XmlObjectSerializerWriteContextComplex(DataContractSerializer serializer, DataContract rootTypeDataContract, DataContractResolver dataContractResolver)
- : base(serializer, rootTypeDataContract, dataContractResolver)
- {
- this.mode = SerializationMode.SharedContract;
- this.preserveObjectReferences = serializer.PreserveObjectReferences;
- this.dataContractSurrogate = serializer.DataContractSurrogate;
- }
- internal XmlObjectSerializerWriteContextComplex(NetDataContractSerializer serializer, Hashtable surrogateDataContracts)
- : base(serializer)
- {
- this.mode = SerializationMode.SharedType;
- this.preserveObjectReferences = true;
- this.streamingContext = serializer.Context;
- this.binder = serializer.Binder;
- this.surrogateSelector = serializer.SurrogateSelector;
- this.surrogateDataContracts = surrogateDataContracts;
- }
- internal XmlObjectSerializerWriteContextComplex(XmlObjectSerializer serializer, int maxItemsInObjectGraph, StreamingContext streamingContext, bool ignoreExtensionDataObject)
- : base(serializer, maxItemsInObjectGraph, streamingContext, ignoreExtensionDataObject)
- {
- }
- internal override SerializationMode Mode
- {
- get { return mode; }
- }
- internal override DataContract GetDataContract(RuntimeTypeHandle typeHandle, Type type)
- {
- DataContract dataContract = null;
- if (mode == SerializationMode.SharedType && surrogateSelector != null)
- {
- dataContract = NetDataContractSerializer.GetDataContractFromSurrogateSelector(surrogateSelector, streamingContext, typeHandle, type, ref surrogateDataContracts);
- }
- if (dataContract != null)
- {
- if (this.IsGetOnlyCollection && dataContract is SurrogateDataContract)
- {
- throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.SurrogatesWithGetOnlyCollectionsNotSupportedSerDeser,
- DataContract.GetClrTypeFullName(dataContract.UnderlyingType))));
- }
- return dataContract;
- }
- return base.GetDataContract(typeHandle, type);
- }
- internal override DataContract GetDataContract(int id, RuntimeTypeHandle typeHandle)
- {
- DataContract dataContract = null;
- if (mode == SerializationMode.SharedType && surrogateSelector != null)
- {
- dataContract = NetDataContractSerializer.GetDataContractFromSurrogateSelector(surrogateSelector, streamingContext, typeHandle, null /*type*/, ref surrogateDataContracts);
- }
- if (dataContract != null)
- {
- if (this.IsGetOnlyCollection && dataContract is SurrogateDataContract)
- {
- throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.SurrogatesWithGetOnlyCollectionsNotSupportedSerDeser,
- DataContract.GetClrTypeFullName(dataContract.UnderlyingType))));
- }
- return dataContract;
- }
- return base.GetDataContract(id, typeHandle);
- }
- internal override DataContract GetDataContractSkipValidation(int typeId, RuntimeTypeHandle typeHandle, Type type)
- {
- DataContract dataContract = null;
- if (mode == SerializationMode.SharedType && surrogateSelector != null)
- {
- dataContract = NetDataContractSerializer.GetDataContractFromSurrogateSelector(surrogateSelector, streamingContext, typeHandle, null /*type*/, ref surrogateDataContracts);
- }
- if (dataContract != null)
- {
- if (this.IsGetOnlyCollection && dataContract is SurrogateDataContract)
- {
- throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.SurrogatesWithGetOnlyCollectionsNotSupportedSerDeser,
- DataContract.GetClrTypeFullName(dataContract.UnderlyingType))));
- }
- return dataContract;
- }
- return base.GetDataContractSkipValidation(typeId, typeHandle, type);
- }
- internal override bool WriteClrTypeInfo(XmlWriterDelegator xmlWriter, DataContract dataContract)
- {
- if (mode == SerializationMode.SharedType)
- {
- NetDataContractSerializer.WriteClrTypeInfo(xmlWriter, dataContract, binder);
- return true;
- }
- return false;
- }
- internal override bool WriteClrTypeInfo(XmlWriterDelegator xmlWriter, Type dataContractType, string clrTypeName, string clrAssemblyName)
- {
- if (mode == SerializationMode.SharedType)
- {
- NetDataContractSerializer.WriteClrTypeInfo(xmlWriter, dataContractType, binder, clrTypeName, clrAssemblyName);
- return true;
- }
- return false;
- }
- internal override bool WriteClrTypeInfo(XmlWriterDelegator xmlWriter, Type dataContractType, SerializationInfo serInfo)
- {
- if (mode == SerializationMode.SharedType)
- {
- NetDataContractSerializer.WriteClrTypeInfo(xmlWriter, dataContractType, binder, serInfo);
- return true;
- }
- return false;
- }
- public override void WriteAnyType(XmlWriterDelegator xmlWriter, object value)
- {
- if (!OnHandleReference(xmlWriter, value, false /*canContainCyclicReference*/))
- xmlWriter.WriteAnyType(value);
- }
- public override void WriteString(XmlWriterDelegator xmlWriter, string value)
- {
- if (!OnHandleReference(xmlWriter, value, false /*canContainCyclicReference*/))
- xmlWriter.WriteString(value);
- }
- public override void WriteString(XmlWriterDelegator xmlWriter, string value, XmlDictionaryString name, XmlDictionaryString ns)
- {
- if (value == null)
- WriteNull(xmlWriter, typeof(string), true/*isMemberTypeSerializable*/, name, ns);
- else
- {
- xmlWriter.WriteStartElementPrimitive(name, ns);
- if (!OnHandleReference(xmlWriter, value, false /*canContainCyclicReference*/))
- xmlWriter.WriteString(value);
- xmlWriter.WriteEndElementPrimitive();
- }
- }
- public override void WriteBase64(XmlWriterDelegator xmlWriter, byte[] value)
- {
- if (!OnHandleReference(xmlWriter, value, false /*canContainCyclicReference*/))
- xmlWriter.WriteBase64(value);
- }
- public override void WriteBase64(XmlWriterDelegator xmlWriter, byte[] value, XmlDictionaryString name, XmlDictionaryString ns)
- {
- if (value == null)
- WriteNull(xmlWriter, typeof(byte[]), true/*isMemberTypeSerializable*/, name, ns);
- else
- {
- xmlWriter.WriteStartElementPrimitive(name, ns);
- if (!OnHandleReference(xmlWriter, value, false /*canContainCyclicReference*/))
- xmlWriter.WriteBase64(value);
- xmlWriter.WriteEndElementPrimitive();
- }
- }
- public override void WriteUri(XmlWriterDelegator xmlWriter, Uri value)
- {
- if (!OnHandleReference(xmlWriter, value, false /*canContainCyclicReference*/))
- xmlWriter.WriteUri(value);
- }
- public override void WriteUri(XmlWriterDelegator xmlWriter, Uri value, XmlDictionaryString name, XmlDictionaryString ns)
- {
- if (value == null)
- WriteNull(xmlWriter, typeof(Uri), true/*isMemberTypeSerializable*/, name, ns);
- else
- {
- xmlWriter.WriteStartElementPrimitive(name, ns);
- if (!OnHandleReference(xmlWriter, value, false /*canContainCyclicReference*/))
- xmlWriter.WriteUri(value);
- xmlWriter.WriteEndElementPrimitive();
- }
- }
- public override void WriteQName(XmlWriterDelegator xmlWriter, XmlQualifiedName value)
- {
- if (!OnHandleReference(xmlWriter, value, false /*canContainCyclicReference*/))
- xmlWriter.WriteQName(value);
- }
- public override void WriteQName(XmlWriterDelegator xmlWriter, XmlQualifiedName value, XmlDictionaryString name, XmlDictionaryString ns)
- {
- if (value == null)
- WriteNull(xmlWriter, typeof(XmlQualifiedName), true/*isMemberTypeSerializable*/, name, ns);
- else
- {
- if (ns != null && ns.Value != null && ns.Value.Length > 0)
- xmlWriter.WriteStartElement(Globals.ElementPrefix, name, ns);
- else
- xmlWriter.WriteStartElement(name, ns);
- if (!OnHandleReference(xmlWriter, value, false /*canContainCyclicReference*/))
- xmlWriter.WriteQName(value);
- xmlWriter.WriteEndElement();
- }
- }
- public override void InternalSerialize(XmlWriterDelegator xmlWriter, object obj, bool isDeclaredType, bool writeXsiType, int declaredTypeID, RuntimeTypeHandle declaredTypeHandle)
- {
- if (dataContractSurrogate == null)
- {
- base.InternalSerialize(xmlWriter, obj, isDeclaredType, writeXsiType, declaredTypeID, declaredTypeHandle);
- }
- else
- {
- InternalSerializeWithSurrogate(xmlWriter, obj, isDeclaredType, writeXsiType, declaredTypeID, declaredTypeHandle);
- }
- }
- internal override bool OnHandleReference(XmlWriterDelegator xmlWriter, object obj, bool canContainCyclicReference)
- {
- if (preserveObjectReferences && !this.IsGetOnlyCollection)
- {
- bool isNew = true;
- int objectId = SerializedObjects.GetId(obj, ref isNew);
- if (isNew)
- xmlWriter.WriteAttributeInt(Globals.SerPrefix, DictionaryGlobals.IdLocalName, DictionaryGlobals.SerializationNamespace, objectId);
- else
- {
- xmlWriter.WriteAttributeInt(Globals.SerPrefix, DictionaryGlobals.RefLocalName, DictionaryGlobals.SerializationNamespace, objectId);
- xmlWriter.WriteAttributeBool(Globals.XsiPrefix, DictionaryGlobals.XsiNilLocalName, DictionaryGlobals.SchemaInstanceNamespace, true);
- }
- return !isNew;
- }
- return base.OnHandleReference(xmlWriter, obj, canContainCyclicReference);
- }
- internal override void OnEndHandleReference(XmlWriterDelegator xmlWriter, object obj, bool canContainCyclicReference)
- {
- if (preserveObjectReferences && !this.IsGetOnlyCollection)
- return;
- base.OnEndHandleReference(xmlWriter, obj, canContainCyclicReference);
- }
- [Fx.Tag.SecurityNote(Critical = "Calls the critical methods of ISurrogateSelector", Safe = "Demands for FullTrust")]
- [SecuritySafeCritical]
- [PermissionSet(SecurityAction.Demand, Unrestricted = true)]
- [MethodImpl(MethodImplOptions.NoInlining)]
- bool CheckIfTypeSerializableForSharedTypeMode(Type memberType)
- {
- Fx.Assert(surrogateSelector != null, "Method should not be called when surrogateSelector is null.");
- ISurrogateSelector surrogateSelectorNotUsed;
- return (surrogateSelector.GetSurrogate(memberType, streamingContext, out surrogateSelectorNotUsed) != null);
- }
- internal override void CheckIfTypeSerializable(Type memberType, bool isMemberTypeSerializable)
- {
- if (mode == SerializationMode.SharedType && surrogateSelector != null &&
- CheckIfTypeSerializableForSharedTypeMode(memberType))
- {
- return;
- }
- else
- {
- if (dataContractSurrogate != null)
- {
- while (memberType.IsArray)
- memberType = memberType.GetElementType();
- memberType = DataContractSurrogateCaller.GetDataContractType(dataContractSurrogate, memberType);
- if (!DataContract.IsTypeSerializable(memberType))
- throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.TypeNotSerializable, memberType)));
- return;
- }
- }
- base.CheckIfTypeSerializable(memberType, isMemberTypeSerializable);
- }
- internal override Type GetSurrogatedType(Type type)
- {
- if (dataContractSurrogate == null)
- {
- return base.GetSurrogatedType(type);
- }
- else
- {
- type = DataContract.UnwrapNullableType(type);
- Type surrogateType = DataContractSerializer.GetSurrogatedType(dataContractSurrogate, type);
- if (this.IsGetOnlyCollection && surrogateType != type)
- {
- throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.SurrogatesWithGetOnlyCollectionsNotSupportedSerDeser,
- DataContract.GetClrTypeFullName(type))));
- }
- else
- {
- return surrogateType;
- }
- }
- }
- void InternalSerializeWithSurrogate(XmlWriterDelegator xmlWriter, object obj, bool isDeclaredType, bool writeXsiType, int declaredTypeID, RuntimeTypeHandle declaredTypeHandle)
- {
- RuntimeTypeHandle objTypeHandle = isDeclaredType ? declaredTypeHandle : Type.GetTypeHandle(obj);
- object oldObj = obj;
- int objOldId = 0;
- Type objType = Type.GetTypeFromHandle(objTypeHandle);
- Type declaredType = GetSurrogatedType(Type.GetTypeFromHandle(declaredTypeHandle));
- if (TD.DCSerializeWithSurrogateStartIsEnabled())
- {
- TD.DCSerializeWithSurrogateStart(declaredType.FullName);
- }
- declaredTypeHandle = declaredType.TypeHandle;
- obj = DataContractSerializer.SurrogateToDataContractType(dataContractSurrogate, obj, declaredType, ref objType);
- objTypeHandle = objType.TypeHandle;
- if (oldObj != obj)
- objOldId = SerializedObjects.ReassignId(0, oldObj, obj);
- if (writeXsiType)
- {
- declaredType = Globals.TypeOfObject;
- SerializeWithXsiType(xmlWriter, obj, objTypeHandle, objType, -1, declaredType.TypeHandle, declaredType);
- }
- else if (declaredTypeHandle.Equals(objTypeHandle))
- {
- DataContract contract = GetDataContract(objTypeHandle, objType);
- SerializeWithoutXsiType(contract, xmlWriter, obj, declaredTypeHandle);
- }
- else
- {
- SerializeWithXsiType(xmlWriter, obj, objTypeHandle, objType, -1, declaredTypeHandle, declaredType);
- }
- if (oldObj != obj)
- SerializedObjects.ReassignId(objOldId, obj, oldObj);
- if (TD.DCSerializeWithSurrogateStopIsEnabled())
- {
- TD.DCSerializeWithSurrogateStop();
- }
- }
- internal override void WriteArraySize(XmlWriterDelegator xmlWriter, int size)
- {
- if (preserveObjectReferences && size > -1)
- xmlWriter.WriteAttributeInt(Globals.SerPrefix, DictionaryGlobals.ArraySizeLocalName, DictionaryGlobals.SerializationNamespace, size);
- }
- }
- }
|