// Commences the process of serializing the entire graph.
// initialize the graph walker.
internal void Serialize(Object graph, Header[] inHeaders, SoapWriter serWriter)
{
InternalST.Soap( this, "Serialize Entry 2 ",graph,((headers == null)?" no headers ": "headers"));
serializationPermission.Demand();
if (graph == null)
throw new ArgumentNullException("graph",SoapUtil.GetResourceString("ArgumentNull_Graph"));
if (serWriter == null)
throw new ArgumentNullException("serWriter",String.Format(SoapUtil.GetResourceString("ArgumentNull_WithParamName"), "serWriter"));
serObjectInfoInit = new SerObjectInfoInit();
this.serWriter = serWriter;
this.headers = inHeaders;
if (graph is IMethodMessage)
{
bRemoting = true;
MethodBase methodBase = ((IMethodMessage)graph).MethodBase;
if (methodBase != null)
serWriter.WriteXsdVersion(ProcessTypeAttributes(methodBase.ReflectedType));
else
serWriter.WriteXsdVersion(XsdVersion.V2001);
}
else
serWriter.WriteXsdVersion(XsdVersion.V2001);
m_idGenerator = new ObjectIDGenerator();
m_objectQueue = new Queue();
if (graph is ISoapMessage)
{
// Fake method call is to be written
bRemoting = true;
ISoapMessage ismc = (ISoapMessage)graph;
graph = new InternalSoapMessage(ismc.MethodName, ismc.XmlNameSpace, ismc.ParamNames, ismc.ParamValues, ismc.ParamTypes);
headers = ismc.Headers;
}
InternalST.Soap( this, "Serialize New SerializedTypeTable");
m_serializedTypeTable = new Hashtable();
serWriter.WriteBegin();
long headerId = 0;
Object obj;
long objectId;
bool isNew;
topId = m_idGenerator.GetId(graph, out isNew);
if (headers != null)
headerId = m_idGenerator.GetId(headers, out isNew);
else
headerId = -1;
WriteSerializedStreamHeader(topId, headerId);
InternalST.Soap( this, "Serialize Schedule 0");
// Write out SerializedStream header
if (!((headers == null) || (headers.Length == 0)))
{
ProcessHeaders(headerId);
}
m_objectQueue.Enqueue(graph);
while ((obj = GetNext(out objectId))!=null)
{
InternalST.Soap( this, "Serialize GetNext ",obj);
WriteObjectInfo objectInfo = null;
// GetNext will return either an object or a WriteObjectInfo.
// A WriteObjectInfo is returned if this object was member of another object
if (obj is WriteObjectInfo)
{
InternalST.Soap( this, "Serialize GetNext recognizes WriteObjectInfo");
objectInfo = (WriteObjectInfo)obj;
}
else
{
objectInfo = WriteObjectInfo.Serialize(obj, m_surrogates, m_context, serObjectInfoInit, m_formatterConverter, null);
objectInfo.assemId = GetAssemblyId(objectInfo);
}
objectInfo.objectId = objectId;
NameInfo typeNameInfo = TypeToNameInfo(objectInfo);
typeNameInfo.NIisTopLevelObject = true;
if (bRemoting && obj == graph)
typeNameInfo.NIisRemoteRecord = true;
Write(objectInfo, typeNameInfo, typeNameInfo);
PutNameInfo(typeNameInfo);
objectInfo.ObjectEnd();
}
serWriter.WriteSerializationHeaderEnd();
serWriter.WriteEnd();
m_idGenerator = new ObjectIDGenerator();
InternalST.Soap( this, "*************Serialize New SerializedTypeTable 2");
m_serializedTypeTable = new System.Collections.Hashtable();
InternalST.Soap( this, "Serialize Exit ");
}