public override void Serialize(SerializationContext context)
 {
     if (MessageHeader.MessageType == MessageType.Amf0Data)
     {
         var sc = new Amf.Serialization.Amf0.SerializationContext(context.WriteBuffer);
         foreach (var data in Data)
         {
             context.Amf0Writer.WriteValueBytes(data, sc);
         }
     }
     else
     {
         var sc = new Amf.Serialization.Amf3.SerializationContext(context.WriteBuffer);
         foreach (var data in Data)
         {
             context.Amf3Writer.WriteValueBytes(data, sc);
         }
     }
 }
 public void SerializeAmf0(SerializationContext context)
 {
     using (var writeContext = new Amf.Serialization.Amf0.SerializationContext(context.WriteBuffer))
     {
         if (ProcedureName == null)
         {
             ProcedureName = GetType().GetCustomAttribute <RtmpCommandAttribute>().Name;
         }
         Debug.Assert(!string.IsNullOrEmpty(ProcedureName));
         context.Amf0Writer.WriteBytes(ProcedureName, writeContext);
         context.Amf0Writer.WriteBytes(TranscationID, writeContext);
         context.Amf0Writer.WriteValueBytes(CommandObject, writeContext);
         var optionArguments = GetType().GetProperties().Where(p => p.GetCustomAttribute <OptionalArgumentAttribute>() != null).ToList();
         foreach (var optionArgument in optionArguments)
         {
             context.Amf0Writer.WriteValueBytes(optionArgument.GetValue(this), writeContext);
         }
     }
 }