/// <summary> /// Serialize an AMFX packet. /// </summary> /// <exception cref="SerializationException">Error during serialization.</exception> private static void SerializePacket(XmlWriter writer, object graph, SerializationContext context) { if (writer == null) throw new ArgumentNullException("writer"); if (context == null) throw new ArgumentNullException("context"); if (graph == null) throw new ArgumentNullException("graph"); var packet = graph as AmfPacket; if (packet == null) throw new SerializationException("Object is not an AmfPacket"); writer.WriteStartDocument(); writer.WriteStartElement(AmfxContent.AmfxDocument, AmfxContent.Namespace); writer.WriteAttributeString(AmfxContent.VersionAttribute, context.AmfVersion.ToAmfxName()); writer.WriteAttributeString(AmfxContent.PacketHeaderCount, packet.Headers.Count.ToString()); writer.WriteAttributeString(AmfxContent.PacketBodyCount, packet.Messages.Count.ToString()); //Write headers foreach (var header in packet.Headers.Values) { writer.WriteStartElement(AmfxContent.PacketHeader); writer.WriteAttributeString(AmfxContent.PacketHeaderName, header.Name); writer.WriteAttributeString(AmfxContent.PacketHeaderMustUnderstand, header.MustUnderstand.ToString()); Serialize(writer, header.Data, context); writer.WriteEndElement(); context.ResetReferences(); } //Write bodies foreach (var body in packet.Messages) { writer.WriteStartElement(AmfxContent.PacketBody); writer.WriteAttributeString(AmfxContent.PacketBodyTarget, body.Target); writer.WriteAttributeString(AmfxContent.PacketBodyResponse, body.Response); Serialize(writer, body.Data, context); writer.WriteEndElement(); context.ResetReferences(); } writer.WriteEndElement(); writer.WriteEndDocument(); }