Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / clr / src / ManagedLibraries / SoapSerializer / SoapObjectInfo.cs / 1 / SoapObjectInfo.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
//============================================================
//
// Class: SerObjectInfo
//
// Author: Peter de Jong ([....])
//
// Purpose: Holds information about an objects Members
//
// Date: September 29, 1999
//
//===========================================================
namespace System.Runtime.Serialization.Formatters.Soap
{
using System.Runtime.Remoting;
using System.Runtime.Remoting.Metadata;
using System.Runtime.Serialization;
using System;
using System.Collections;
using System.Reflection;
using System.Diagnostics;
using System.Globalization;
// This class contains information about an object. It is used so that
// the rest of the Formatter routines can use a common interface for
// a normal object, an ISerializable object, and a surrogate object
//
// The methods in this class are for the internal use of the Formatters.
// There use will be restricted when signing is supported for assemblies
internal sealed class WriteObjectInfo
{
internal int objectInfoId;
internal Object obj;
internal Type objectType;
internal bool isSi = false;
internal bool isNamed = false;
internal bool isTyped = false;
internal SerializationInfo si = null;
internal SerObjectInfoCache cache = null;
internal Object[] memberData = null;
internal ISerializationSurrogate serializationSurrogate = null;
internal ISurrogateSelector surrogateSelector;
internal IFormatterConverter converter;
internal StreamingContext context;
internal SerObjectInfoInit serObjectInfoInit = null;
// Writing and Parsing information
internal long objectId;
internal long assemId;
private int lastPosition = 0;
private SoapAttributeInfo parentMemberAttributeInfo;
internal bool isArray = false;
internal SoapAttributeInfo typeAttributeInfo;
internal WriteObjectInfo arrayElemObjectInfo;
internal WriteObjectInfo()
{
}
internal void ObjectEnd()
{
InternalST.Soap( this, objectInfoId," objectType ",objectType," ObjectEnd");
PutObjectInfo(serObjectInfoInit, this);
}
private void InternalInit()
{
InternalST.Soap( this, objectInfoId," InternalInit");
obj = null;
objectType = null;
isSi = false;
isNamed = false;
isTyped = false;
si = null;
cache = null;
memberData = null;
isArray = false;
// Writing and Parsing information
objectId = 0;
assemId = 0;
// Added for Soap
lastPosition = 0;
typeAttributeInfo = null;
parentMemberAttributeInfo = null;
arrayElemObjectInfo = null;
}
internal static WriteObjectInfo Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, SoapAttributeInfo attributeInfo, ObjectWriter objectWriter)
{
WriteObjectInfo soi = GetObjectInfo(serObjectInfoInit);
soi.InitSerialize(obj, surrogateSelector, context, serObjectInfoInit, converter, attributeInfo, objectWriter);
return soi;
}
// Write constructor
internal void InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, SoapAttributeInfo attributeInfo, ObjectWriter objectWriter)
{
InternalST.Soap( this, objectInfoId," Constructor 1 ",obj);
this.context = context;
this.obj = obj;
this.serObjectInfoInit = serObjectInfoInit;
this.parentMemberAttributeInfo = attributeInfo;
this.surrogateSelector = surrogateSelector;
this.converter = converter;
ISurrogateSelector surrogateSelectorTemp;
if (RemotingServices.IsTransparentProxy(obj))
objectType = Converter.typeofMarshalByRefObject;
else
objectType = obj.GetType();
if (objectType.IsArray)
{
arrayElemObjectInfo = Serialize(objectType.GetElementType(), surrogateSelector, context, serObjectInfoInit, converter, null);
typeAttributeInfo = GetTypeAttributeInfo();
isArray = true;
InitNoMembers();
return;
}
InternalST.Soap( this, objectInfoId," Constructor 1 trace 2");
typeAttributeInfo = GetTypeAttributeInfo();
objectWriter.ObjectManager.RegisterObject(obj);
if (surrogateSelector != null && (serializationSurrogate = surrogateSelector.GetSurrogate(objectType, context, out surrogateSelectorTemp)) != null)
{
InternalST.Soap( this, objectInfoId," Constructor 1 trace 3");
si = new SerializationInfo(objectType, converter);
if (!objectType.IsPrimitive)
serializationSurrogate.GetObjectData(obj, si, context);
InitSiWrite(objectWriter);
}
else if (obj is ISerializable)
{
if (!objectType.IsSerializable)
{
throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_NonSerType"),
objectType.FullName, objectType.Module.Assembly.FullName));
}
si = new SerializationInfo(objectType, converter);
((ISerializable)obj).GetObjectData(si, context);
InternalST.Soap( this, objectInfoId," Constructor 1 trace 4 ISerializable "+objectType);
InitSiWrite(objectWriter);
}
else
{
InternalST.Soap(this, objectInfoId," Constructor 1 trace 5");
InitMemberInfo();
}
}
[Conditional("SER_LOGGING")]
private void DumpMemberInfo()
{
for (int i=0; i 0)
{
SoapAttributeInfo attributeInfo = cache.memberAttributeInfos[Position(name)];
isEmbedded = attributeInfo.IsEmbedded();
}
InternalST.Soap( this,objectInfoId," ", objectType," IsEmbedded Exit ",isEmbedded);
return isEmbedded;
}
}
internal sealed class ReadObjectInfo
{
internal int objectInfoId;
internal Object obj;
internal Type objectType;
internal ObjectManager objectManager;
internal int count;
internal bool isSi = false;
internal bool isNamed = false;
internal bool isTyped = false;
internal SerializationInfo si = null;
internal SerObjectInfoCache cache = null;
internal String[] wireMemberNames = null;
internal Type[] wireMemberTypes = null;
internal Object[] memberData = null;
internal String[] memberNames = null;
private int lastPosition = 0;
internal ISurrogateSelector surrogateSelector = null;
internal ISerializationSurrogate serializationSurrogate = null;
internal StreamingContext context;
// Si Read
internal ArrayList memberTypesList;
internal SerObjectInfoInit serObjectInfoInit = null;
internal IFormatterConverter formatterConverter;
// fake object for soap top record when remoting or IRemotingFormatter interface
internal bool bfake = false;
internal bool bSoapFault = false;
internal ArrayList paramNameList; // Contain parameter names in correct order
private int majorVersion = 0;
private int minorVersion = 0;
internal SoapAttributeInfo typeAttributeInfo;
private ReadObjectInfo arrayElemObjectInfo;
private int numberMembersSeen = 0;
internal ReadObjectInfo()
{
}
internal void ObjectEnd()
{
InternalST.Soap( this, objectInfoId," objectType ",objectType," ObjectEnd");
PutObjectInfo(serObjectInfoInit, this);
}
private void InternalInit()
{
InternalST.Soap( this, objectInfoId," objectType ",objectType," InternalInit");
obj = null;
objectType = null;
count = 0;
isSi = false;
isNamed = false;
isTyped = false;
si = null;
wireMemberNames = null;
wireMemberTypes = null;
cache = null;
lastPosition = 0;
numberMembersSeen = 0;
bfake = false;
bSoapFault = false;
majorVersion = 0;
minorVersion = 0;
typeAttributeInfo = null;
arrayElemObjectInfo = null;
// Si Read
if (memberTypesList != null)
{
memberTypesList.Clear();
}
}
internal static ReadObjectInfo Create(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName)
{
ReadObjectInfo soi = GetObjectInfo(serObjectInfoInit);
soi.Init(objectType, surrogateSelector, context, objectManager, serObjectInfoInit, converter, assemblyName);
return soi;
}
// Read Constructor
internal void Init(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName)
{
InternalST.Soap( this, objectInfoId," Constructor 3 ",objectType);
this.objectType = objectType;
this.objectManager = objectManager;
this.context = context;
this.serObjectInfoInit = serObjectInfoInit;
this.formatterConverter = converter;
InitReadConstructor(objectType, surrogateSelector, context, assemblyName);
}
internal static ReadObjectInfo Create(Type objectType, String[] memberNames, Type[] memberTypes, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName)
{
ReadObjectInfo soi = GetObjectInfo(serObjectInfoInit);
soi.Init(objectType, memberNames,memberTypes, surrogateSelector, context, objectManager, serObjectInfoInit, converter, assemblyName);
return soi;
}
// Read Constructor
internal void Init(Type objectType, String[] memberNames, Type[] memberTypes, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName)
{
InternalST.Soap( this,objectInfoId, " Constructor 5 ",objectType);
this.objectType = objectType;
this.objectManager = objectManager;
this.wireMemberNames = memberNames;
this.wireMemberTypes = memberTypes;
this.context = context;
this.serObjectInfoInit = serObjectInfoInit;
this.formatterConverter = converter;
if (memberNames != null)
isNamed = true;
if (memberTypes != null)
isTyped = true;
InitReadConstructor(objectType, surrogateSelector, context, assemblyName);
}
private void InitReadConstructor(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, String assemblyName)
{
InternalST.Soap( this,objectInfoId," ", objectType," InitReadConstructor Entry ",objectType);
if (objectType.IsArray)
{
arrayElemObjectInfo = Create(objectType.GetElementType(), surrogateSelector, context, objectManager, serObjectInfoInit, formatterConverter, assemblyName);
typeAttributeInfo = GetTypeAttributeInfo();
InitNoMembers();
return;
}
ISurrogateSelector surrogateSelectorTemp = null;
if (surrogateSelector!=null)
serializationSurrogate = surrogateSelector.GetSurrogate(objectType, context, out surrogateSelectorTemp);
if (serializationSurrogate != null)
{
isSi = true;
}
else if (objectType == Converter.typeofObject)
{
}
else if (Converter.typeofISerializable.IsAssignableFrom(objectType))
isSi = true;
if (isSi)
{
si = new SerializationInfo(objectType, formatterConverter);
InitSiRead(assemblyName);
}
else
{
InitMemberInfo();
}
InternalST.Soap( this,objectInfoId," ", objectType," InitReadConstructor Exit ",isSi);
}
private void InitSiRead(String assemblyName)
{
InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo new cache");
if (assemblyName != null)
{
// Need to set to assembly name from the wire. This assembly name could contain version information
// not in the default assembly name which was returned from fusion
si.AssemblyName = assemblyName;
}
cache = new SerObjectInfoCache();
cache.fullTypeName = si.FullTypeName;
cache.assemblyString = si.AssemblyName;
// Input from IFieldInfo
cache.memberNames = wireMemberNames;
cache.memberTypes = wireMemberTypes;
if (memberTypesList != null)
{
memberTypesList = new ArrayList(20);
}
if (wireMemberNames != null && wireMemberTypes != null)
isTyped = true;
}
private void InitNoMembers()
{
cache = (SerObjectInfoCache)serObjectInfoInit.seenBeforeTable[objectType];
if (cache == null)
{
InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo new cache");
cache = new SerObjectInfoCache();
cache.fullTypeName = objectType.FullName;
cache.assemblyString = objectType.Module.Assembly.FullName;
serObjectInfoInit.seenBeforeTable.Add(objectType, cache);
}
}
private void InitMemberInfo()
{
InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo Entry");
cache = (SerObjectInfoCache)serObjectInfoInit.seenBeforeTable[objectType];
if (cache == null)
{
InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo new cache");
cache = new SerObjectInfoCache();
cache.memberInfos = FormatterServices.GetSerializableMembers(objectType, context);
count = cache.memberInfos.Length;
cache.memberNames = new String[count];
cache.memberTypes = new Type[count];
cache.memberAttributeInfos = new SoapAttributeInfo[count];
// Calculate new arrays
for (int i=0; i= cache.memberTypes.Length)
throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_ISerializableTypes"),objectType+" "+position));
type = cache.memberTypes[position];
InternalST.Soap( this,objectInfoId," ", objectType," GetType Exit ByPosition ",type);
}
return type;
}
internal void AddParamName(String name)
{
if (!bfake)
return;
if (name[0] == '_' && name[1] == '_')
{
if (name == "__fault")
{
bSoapFault = true;
return;
}
else if (name == "__methodName" || name == "__keyToNamespaceTable" || name == "__paramNameList" || name == "__xmlNameSpace")
{
return;
}
}
InternalST.Soap( this,objectInfoId," ", objectType," AddParamName Add "+name);
paramNameList.Add(name);
}
// Adds the value for a memberName
internal void AddValue(String name, Object value)
{
InternalST.Soap( this,objectInfoId," ", objectType," AddValue ",name," ",value," isSi ",isSi);
if (isSi)
{
if (bfake)
{
AddParamName(name);
}
si.AddValue(name, value);
}
else
{
// Console.WriteLine("Calling add value for " + name + " with value " + value);
int position = Position(name);
memberData[position] = value;
memberNames[position] = name;
}
}
internal void AddMemberSeen()
{
InternalST.Soap( this,objectInfoId," ", objectType," AddMemberSeen ");
numberMembersSeen++;
}
//Soap fake object
internal ArrayList SetFakeObject()
{
bfake = true;
paramNameList = new ArrayList(10);
return paramNameList;
}
internal void SetVersion(int major, int minor)
{
majorVersion = major;
minorVersion = minor;
}
// Records an objectId in a member when the actual object for that member is not yet known
internal void RecordFixup(long objectId, String name, long idRef)
{
if (isSi)
{
InternalST.Soap( this,objectInfoId," ", objectType, " RecordFixup RecordDelayedFixup objectId ",objectId," name ",name," idRef ",idRef," isSi ",isSi);
objectManager.RecordDelayedFixup(objectId, name, idRef);
}
else
{
InternalST.Soap( this,objectInfoId," ", objectType," RecordFixup objectId ",objectId," name ",name," idRef ",idRef," isSi ",isSi);
objectManager.RecordFixup(objectId, cache.memberInfos[Position(name)], idRef);
}
}
// Fills in the values for an object
internal void PopulateObjectMembers()
{
InternalST.Soap( this,objectInfoId," ", objectType," PopulateObjectMembers isSi ",isSi);
if (!isSi)
{
MemberInfo[] finalMemberInfos = null;
Object[] finalMemberData = null;
int finalMemberIndex = 0;
if (numberMembersSeen < memberNames.Length) {
finalMemberInfos = new MemberInfo[numberMembersSeen];
finalMemberData = new Object[numberMembersSeen];
for (int iMember = 0; iMember < memberNames.Length; ++iMember) {
if (memberNames[iMember] == null) {
// A field on the type isnt found. See if the field has OptionallySerializable and the type has the deserialization constructor
Object [] attrs = cache.memberInfos[iMember].GetCustomAttributes(typeof(OptionalFieldAttribute), false);
if ((attrs == null || attrs.Length == 0) && (majorVersion >= 1 && minorVersion >= 0) ){
// the member isnt optionally serializable
throw new SerializationException(SoapUtil.GetResourceString("Serialization_WrongNumberOfMembers",
objectType, cache.memberInfos.Length, numberMembersSeen));
}
}
else {
if (memberNames[iMember] != cache.memberInfos[iMember].Name) {
throw new SerializationException(SoapUtil.GetResourceString("Serialization_WrongNumberOfMembers",
objectType, cache.memberInfos.Length, numberMembersSeen));
}
finalMemberInfos[finalMemberIndex] = cache.memberInfos[iMember];
finalMemberData[finalMemberIndex] = memberData[iMember];
finalMemberIndex++;
}
}
}
else {
finalMemberInfos = cache.memberInfos;
finalMemberData = memberData;
}
DumpPopulate(finalMemberInfos, finalMemberData);
FormatterServices.PopulateObjectMembers(obj, finalMemberInfos, finalMemberData);
numberMembersSeen = 0;
}
}
[Conditional("SER_LOGGING")]
private void DumpPopulate(MemberInfo[] memberInfos, Object[] memberData)
{
for (int i=0; i
// Author: Peter de Jong ([....])
//
// Purpose: Holds information about an objects Members
//
// Date: September 29, 1999
//
//===========================================================
namespace System.Runtime.Serialization.Formatters.Soap
{
using System.Runtime.Remoting;
using System.Runtime.Remoting.Metadata;
using System.Runtime.Serialization;
using System;
using System.Collections;
using System.Reflection;
using System.Diagnostics;
using System.Globalization;
// This class contains information about an object. It is used so that
// the rest of the Formatter routines can use a common interface for
// a normal object, an ISerializable object, and a surrogate object
//
// The methods in this class are for the internal use of the Formatters.
// There use will be restricted when signing is supported for assemblies
internal sealed class WriteObjectInfo
{
internal int objectInfoId;
internal Object obj;
internal Type objectType;
internal bool isSi = false;
internal bool isNamed = false;
internal bool isTyped = false;
internal SerializationInfo si = null;
internal SerObjectInfoCache cache = null;
internal Object[] memberData = null;
internal ISerializationSurrogate serializationSurrogate = null;
internal ISurrogateSelector surrogateSelector;
internal IFormatterConverter converter;
internal StreamingContext context;
internal SerObjectInfoInit serObjectInfoInit = null;
// Writing and Parsing information
internal long objectId;
internal long assemId;
private int lastPosition = 0;
private SoapAttributeInfo parentMemberAttributeInfo;
internal bool isArray = false;
internal SoapAttributeInfo typeAttributeInfo;
internal WriteObjectInfo arrayElemObjectInfo;
internal WriteObjectInfo()
{
}
internal void ObjectEnd()
{
InternalST.Soap( this, objectInfoId," objectType ",objectType," ObjectEnd");
PutObjectInfo(serObjectInfoInit, this);
}
private void InternalInit()
{
InternalST.Soap( this, objectInfoId," InternalInit");
obj = null;
objectType = null;
isSi = false;
isNamed = false;
isTyped = false;
si = null;
cache = null;
memberData = null;
isArray = false;
// Writing and Parsing information
objectId = 0;
assemId = 0;
// Added for Soap
lastPosition = 0;
typeAttributeInfo = null;
parentMemberAttributeInfo = null;
arrayElemObjectInfo = null;
}
internal static WriteObjectInfo Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, SoapAttributeInfo attributeInfo, ObjectWriter objectWriter)
{
WriteObjectInfo soi = GetObjectInfo(serObjectInfoInit);
soi.InitSerialize(obj, surrogateSelector, context, serObjectInfoInit, converter, attributeInfo, objectWriter);
return soi;
}
// Write constructor
internal void InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, SoapAttributeInfo attributeInfo, ObjectWriter objectWriter)
{
InternalST.Soap( this, objectInfoId," Constructor 1 ",obj);
this.context = context;
this.obj = obj;
this.serObjectInfoInit = serObjectInfoInit;
this.parentMemberAttributeInfo = attributeInfo;
this.surrogateSelector = surrogateSelector;
this.converter = converter;
ISurrogateSelector surrogateSelectorTemp;
if (RemotingServices.IsTransparentProxy(obj))
objectType = Converter.typeofMarshalByRefObject;
else
objectType = obj.GetType();
if (objectType.IsArray)
{
arrayElemObjectInfo = Serialize(objectType.GetElementType(), surrogateSelector, context, serObjectInfoInit, converter, null);
typeAttributeInfo = GetTypeAttributeInfo();
isArray = true;
InitNoMembers();
return;
}
InternalST.Soap( this, objectInfoId," Constructor 1 trace 2");
typeAttributeInfo = GetTypeAttributeInfo();
objectWriter.ObjectManager.RegisterObject(obj);
if (surrogateSelector != null && (serializationSurrogate = surrogateSelector.GetSurrogate(objectType, context, out surrogateSelectorTemp)) != null)
{
InternalST.Soap( this, objectInfoId," Constructor 1 trace 3");
si = new SerializationInfo(objectType, converter);
if (!objectType.IsPrimitive)
serializationSurrogate.GetObjectData(obj, si, context);
InitSiWrite(objectWriter);
}
else if (obj is ISerializable)
{
if (!objectType.IsSerializable)
{
throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_NonSerType"),
objectType.FullName, objectType.Module.Assembly.FullName));
}
si = new SerializationInfo(objectType, converter);
((ISerializable)obj).GetObjectData(si, context);
InternalST.Soap( this, objectInfoId," Constructor 1 trace 4 ISerializable "+objectType);
InitSiWrite(objectWriter);
}
else
{
InternalST.Soap(this, objectInfoId," Constructor 1 trace 5");
InitMemberInfo();
}
}
[Conditional("SER_LOGGING")]
private void DumpMemberInfo()
{
for (int i=0; i 0)
{
SoapAttributeInfo attributeInfo = cache.memberAttributeInfos[Position(name)];
isEmbedded = attributeInfo.IsEmbedded();
}
InternalST.Soap( this,objectInfoId," ", objectType," IsEmbedded Exit ",isEmbedded);
return isEmbedded;
}
}
internal sealed class ReadObjectInfo
{
internal int objectInfoId;
internal Object obj;
internal Type objectType;
internal ObjectManager objectManager;
internal int count;
internal bool isSi = false;
internal bool isNamed = false;
internal bool isTyped = false;
internal SerializationInfo si = null;
internal SerObjectInfoCache cache = null;
internal String[] wireMemberNames = null;
internal Type[] wireMemberTypes = null;
internal Object[] memberData = null;
internal String[] memberNames = null;
private int lastPosition = 0;
internal ISurrogateSelector surrogateSelector = null;
internal ISerializationSurrogate serializationSurrogate = null;
internal StreamingContext context;
// Si Read
internal ArrayList memberTypesList;
internal SerObjectInfoInit serObjectInfoInit = null;
internal IFormatterConverter formatterConverter;
// fake object for soap top record when remoting or IRemotingFormatter interface
internal bool bfake = false;
internal bool bSoapFault = false;
internal ArrayList paramNameList; // Contain parameter names in correct order
private int majorVersion = 0;
private int minorVersion = 0;
internal SoapAttributeInfo typeAttributeInfo;
private ReadObjectInfo arrayElemObjectInfo;
private int numberMembersSeen = 0;
internal ReadObjectInfo()
{
}
internal void ObjectEnd()
{
InternalST.Soap( this, objectInfoId," objectType ",objectType," ObjectEnd");
PutObjectInfo(serObjectInfoInit, this);
}
private void InternalInit()
{
InternalST.Soap( this, objectInfoId," objectType ",objectType," InternalInit");
obj = null;
objectType = null;
count = 0;
isSi = false;
isNamed = false;
isTyped = false;
si = null;
wireMemberNames = null;
wireMemberTypes = null;
cache = null;
lastPosition = 0;
numberMembersSeen = 0;
bfake = false;
bSoapFault = false;
majorVersion = 0;
minorVersion = 0;
typeAttributeInfo = null;
arrayElemObjectInfo = null;
// Si Read
if (memberTypesList != null)
{
memberTypesList.Clear();
}
}
internal static ReadObjectInfo Create(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName)
{
ReadObjectInfo soi = GetObjectInfo(serObjectInfoInit);
soi.Init(objectType, surrogateSelector, context, objectManager, serObjectInfoInit, converter, assemblyName);
return soi;
}
// Read Constructor
internal void Init(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName)
{
InternalST.Soap( this, objectInfoId," Constructor 3 ",objectType);
this.objectType = objectType;
this.objectManager = objectManager;
this.context = context;
this.serObjectInfoInit = serObjectInfoInit;
this.formatterConverter = converter;
InitReadConstructor(objectType, surrogateSelector, context, assemblyName);
}
internal static ReadObjectInfo Create(Type objectType, String[] memberNames, Type[] memberTypes, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName)
{
ReadObjectInfo soi = GetObjectInfo(serObjectInfoInit);
soi.Init(objectType, memberNames,memberTypes, surrogateSelector, context, objectManager, serObjectInfoInit, converter, assemblyName);
return soi;
}
// Read Constructor
internal void Init(Type objectType, String[] memberNames, Type[] memberTypes, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName)
{
InternalST.Soap( this,objectInfoId, " Constructor 5 ",objectType);
this.objectType = objectType;
this.objectManager = objectManager;
this.wireMemberNames = memberNames;
this.wireMemberTypes = memberTypes;
this.context = context;
this.serObjectInfoInit = serObjectInfoInit;
this.formatterConverter = converter;
if (memberNames != null)
isNamed = true;
if (memberTypes != null)
isTyped = true;
InitReadConstructor(objectType, surrogateSelector, context, assemblyName);
}
private void InitReadConstructor(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, String assemblyName)
{
InternalST.Soap( this,objectInfoId," ", objectType," InitReadConstructor Entry ",objectType);
if (objectType.IsArray)
{
arrayElemObjectInfo = Create(objectType.GetElementType(), surrogateSelector, context, objectManager, serObjectInfoInit, formatterConverter, assemblyName);
typeAttributeInfo = GetTypeAttributeInfo();
InitNoMembers();
return;
}
ISurrogateSelector surrogateSelectorTemp = null;
if (surrogateSelector!=null)
serializationSurrogate = surrogateSelector.GetSurrogate(objectType, context, out surrogateSelectorTemp);
if (serializationSurrogate != null)
{
isSi = true;
}
else if (objectType == Converter.typeofObject)
{
}
else if (Converter.typeofISerializable.IsAssignableFrom(objectType))
isSi = true;
if (isSi)
{
si = new SerializationInfo(objectType, formatterConverter);
InitSiRead(assemblyName);
}
else
{
InitMemberInfo();
}
InternalST.Soap( this,objectInfoId," ", objectType," InitReadConstructor Exit ",isSi);
}
private void InitSiRead(String assemblyName)
{
InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo new cache");
if (assemblyName != null)
{
// Need to set to assembly name from the wire. This assembly name could contain version information
// not in the default assembly name which was returned from fusion
si.AssemblyName = assemblyName;
}
cache = new SerObjectInfoCache();
cache.fullTypeName = si.FullTypeName;
cache.assemblyString = si.AssemblyName;
// Input from IFieldInfo
cache.memberNames = wireMemberNames;
cache.memberTypes = wireMemberTypes;
if (memberTypesList != null)
{
memberTypesList = new ArrayList(20);
}
if (wireMemberNames != null && wireMemberTypes != null)
isTyped = true;
}
private void InitNoMembers()
{
cache = (SerObjectInfoCache)serObjectInfoInit.seenBeforeTable[objectType];
if (cache == null)
{
InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo new cache");
cache = new SerObjectInfoCache();
cache.fullTypeName = objectType.FullName;
cache.assemblyString = objectType.Module.Assembly.FullName;
serObjectInfoInit.seenBeforeTable.Add(objectType, cache);
}
}
private void InitMemberInfo()
{
InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo Entry");
cache = (SerObjectInfoCache)serObjectInfoInit.seenBeforeTable[objectType];
if (cache == null)
{
InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo new cache");
cache = new SerObjectInfoCache();
cache.memberInfos = FormatterServices.GetSerializableMembers(objectType, context);
count = cache.memberInfos.Length;
cache.memberNames = new String[count];
cache.memberTypes = new Type[count];
cache.memberAttributeInfos = new SoapAttributeInfo[count];
// Calculate new arrays
for (int i=0; i= cache.memberTypes.Length)
throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_ISerializableTypes"),objectType+" "+position));
type = cache.memberTypes[position];
InternalST.Soap( this,objectInfoId," ", objectType," GetType Exit ByPosition ",type);
}
return type;
}
internal void AddParamName(String name)
{
if (!bfake)
return;
if (name[0] == '_' && name[1] == '_')
{
if (name == "__fault")
{
bSoapFault = true;
return;
}
else if (name == "__methodName" || name == "__keyToNamespaceTable" || name == "__paramNameList" || name == "__xmlNameSpace")
{
return;
}
}
InternalST.Soap( this,objectInfoId," ", objectType," AddParamName Add "+name);
paramNameList.Add(name);
}
// Adds the value for a memberName
internal void AddValue(String name, Object value)
{
InternalST.Soap( this,objectInfoId," ", objectType," AddValue ",name," ",value," isSi ",isSi);
if (isSi)
{
if (bfake)
{
AddParamName(name);
}
si.AddValue(name, value);
}
else
{
// Console.WriteLine("Calling add value for " + name + " with value " + value);
int position = Position(name);
memberData[position] = value;
memberNames[position] = name;
}
}
internal void AddMemberSeen()
{
InternalST.Soap( this,objectInfoId," ", objectType," AddMemberSeen ");
numberMembersSeen++;
}
//Soap fake object
internal ArrayList SetFakeObject()
{
bfake = true;
paramNameList = new ArrayList(10);
return paramNameList;
}
internal void SetVersion(int major, int minor)
{
majorVersion = major;
minorVersion = minor;
}
// Records an objectId in a member when the actual object for that member is not yet known
internal void RecordFixup(long objectId, String name, long idRef)
{
if (isSi)
{
InternalST.Soap( this,objectInfoId," ", objectType, " RecordFixup RecordDelayedFixup objectId ",objectId," name ",name," idRef ",idRef," isSi ",isSi);
objectManager.RecordDelayedFixup(objectId, name, idRef);
}
else
{
InternalST.Soap( this,objectInfoId," ", objectType," RecordFixup objectId ",objectId," name ",name," idRef ",idRef," isSi ",isSi);
objectManager.RecordFixup(objectId, cache.memberInfos[Position(name)], idRef);
}
}
// Fills in the values for an object
internal void PopulateObjectMembers()
{
InternalST.Soap( this,objectInfoId," ", objectType," PopulateObjectMembers isSi ",isSi);
if (!isSi)
{
MemberInfo[] finalMemberInfos = null;
Object[] finalMemberData = null;
int finalMemberIndex = 0;
if (numberMembersSeen < memberNames.Length) {
finalMemberInfos = new MemberInfo[numberMembersSeen];
finalMemberData = new Object[numberMembersSeen];
for (int iMember = 0; iMember < memberNames.Length; ++iMember) {
if (memberNames[iMember] == null) {
// A field on the type isnt found. See if the field has OptionallySerializable and the type has the deserialization constructor
Object [] attrs = cache.memberInfos[iMember].GetCustomAttributes(typeof(OptionalFieldAttribute), false);
if ((attrs == null || attrs.Length == 0) && (majorVersion >= 1 && minorVersion >= 0) ){
// the member isnt optionally serializable
throw new SerializationException(SoapUtil.GetResourceString("Serialization_WrongNumberOfMembers",
objectType, cache.memberInfos.Length, numberMembersSeen));
}
}
else {
if (memberNames[iMember] != cache.memberInfos[iMember].Name) {
throw new SerializationException(SoapUtil.GetResourceString("Serialization_WrongNumberOfMembers",
objectType, cache.memberInfos.Length, numberMembersSeen));
}
finalMemberInfos[finalMemberIndex] = cache.memberInfos[iMember];
finalMemberData[finalMemberIndex] = memberData[iMember];
finalMemberIndex++;
}
}
}
else {
finalMemberInfos = cache.memberInfos;
finalMemberData = memberData;
}
DumpPopulate(finalMemberInfos, finalMemberData);
FormatterServices.PopulateObjectMembers(obj, finalMemberInfos, finalMemberData);
numberMembersSeen = 0;
}
}
[Conditional("SER_LOGGING")]
private void DumpPopulate(MemberInfo[] memberInfos, Object[] memberData)
{
for (int i=0; i
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- IgnoreDeviceFilterElementCollection.cs
- TextSearch.cs
- ImageListStreamer.cs
- DataBinder.cs
- DelegatingMessage.cs
- InternalsVisibleToAttribute.cs
- FixUp.cs
- BaseProcessor.cs
- TypeSystem.cs
- TableColumn.cs
- StreamGeometry.cs
- DelimitedListTraceListener.cs
- GlyphTypeface.cs
- SizeConverter.cs
- FrameworkElementAutomationPeer.cs
- RequestCacheManager.cs
- FtpWebRequest.cs
- ContextQuery.cs
- XPathParser.cs
- DatatypeImplementation.cs
- DataGridViewCellCancelEventArgs.cs
- TimeSpanValidatorAttribute.cs
- RSACryptoServiceProvider.cs
- GeometryHitTestParameters.cs
- MdiWindowListStrip.cs
- NameValueFileSectionHandler.cs
- HTMLTagNameToTypeMapper.cs
- TextShapeableCharacters.cs
- HMAC.cs
- AutomationEvent.cs
- TdsEnums.cs
- DirectoryNotFoundException.cs
- ProjectionPruner.cs
- GroupBoxRenderer.cs
- safesecurityhelperavalon.cs
- CapabilitiesPattern.cs
- ParseNumbers.cs
- FunctionMappingTranslator.cs
- SortedList.cs
- Journal.cs
- SqlVersion.cs
- OAVariantLib.cs
- TextSpan.cs
- DialogResultConverter.cs
- DataViewManagerListItemTypeDescriptor.cs
- Property.cs
- PasswordBoxAutomationPeer.cs
- CodeDirectoryCompiler.cs
- ExternalException.cs
- ObjectCloneHelper.cs
- PaintValueEventArgs.cs
- HtmlTextArea.cs
- ExpandSegment.cs
- ListView.cs
- PropertyReferenceSerializer.cs
- ImageInfo.cs
- KnownTypesHelper.cs
- ColumnWidthChangingEvent.cs
- TextPenaltyModule.cs
- ControlBindingsConverter.cs
- UnsafeNativeMethods.cs
- BinaryMessageFormatter.cs
- WpfKnownMember.cs
- OutputCacheSection.cs
- ResourceContainer.cs
- _emptywebproxy.cs
- DependencyPropertyConverter.cs
- Pair.cs
- SqlErrorCollection.cs
- StorageFunctionMapping.cs
- sqlcontext.cs
- ScrollChrome.cs
- PasswordTextContainer.cs
- XmlNamespaceDeclarationsAttribute.cs
- XamlHttpHandlerFactory.cs
- CodeAssignStatement.cs
- ColumnWidthChangedEvent.cs
- DLinqTableProvider.cs
- PropertyToken.cs
- WorkerRequest.cs
- StateMachineSubscription.cs
- RpcCryptoRequest.cs
- PauseStoryboard.cs
- ValueCollectionParameterReader.cs
- SectionVisual.cs
- ReadOnlyObservableCollection.cs
- ImageIndexConverter.cs
- QilTernary.cs
- CommonGetThemePartSize.cs
- ContextMenu.cs
- IconHelper.cs
- FileDialogCustomPlace.cs
- RtfToXamlLexer.cs
- BuilderPropertyEntry.cs
- WebPartTransformerAttribute.cs
- XsltQilFactory.cs
- SpellerHighlightLayer.cs
- DataTableNewRowEvent.cs
- UpdatePanelTrigger.cs
- GeometryConverter.cs