/// <summary>
        /// Assembles the StreamMetadataBody object from byte array
        /// </summary>
        /// <param name="reader">BinaryReader to deserialize from</param>
        /// <returns>StreamMetadataBody object</returns>
        public StreamMetadataBody Read(BinaryReader reader)
        {
            var metadataKind          = (StreamMetadataKind)reader.ReadInt32();
            StreamMetadataBody result = null;

            switch (metadataKind)
            {
            case StreamMetadataKind.ReceiveSequenceNumber:
            case StreamMetadataKind.SendSequenceNumber:
            case StreamMetadataKind.DeleteSequenceNumber:
                result = StreamSequenceNumber.FromByteArray(reader);
                break;

            case StreamMetadataKind.OutboundStableParameters:
                result = OutboundStreamStableParameters.FromByteArray(reader);
                break;

            case StreamMetadataKind.InboundStableParameters:
                result = InboundStreamStableParameters.FromByteArray(reader);
                break;

            default:
                Diagnostics.Assert(false, "Unknown Stream MetadataKind in StreamMetadataBody.FromByteArray()");
                break;
            }

            return(result);
        }
 /// <summary>
 /// Converts the OutboundStreamStableParameters to byte array
 /// </summary>
 /// <returns>Byte array</returns>
 public void ToByteArray(OutboundStreamStableParameters value, BinaryWriter writer)
 {
     try
     {
         value.WriteBaseParameters(writer);
         writer.Write(value.MessageQuota);
         writer.Write((int)value.AcceptanceResponse);
     }
     catch (Exception e)
     {
         Tracing.WriteExceptionAsError("OutboundStreamStableParameters.ToByteArray", e, "Content: {0}", this);
     }
 }
        /// <summary>
        /// Copy constructor used for updates to avoid in memory update that would change "committed" state in the store before commit
        /// especially when the object is acquired through Get
        /// </summary>
        /// <param name="stableParameters"></param>
        internal OutboundStreamStableParameters(OutboundStreamStableParameters stableParameters)
        {
            // Init base parameters
            this.InitializeBaseParameters(
                StreamMetadataKind.OutboundStableParameters,
                stableParameters.StreamName,
                stableParameters.PartnerId,
                stableParameters.CurrentState,
                stableParameters.CloseMessageSequenceNumber);

            this.AcceptanceResponse = stableParameters.AcceptanceResponse;
            this.MessageQuota       = stableParameters.MessageQuota;
        }
        /// <summary>
        /// Assembles the OutboundStreamStableParameters object from byte array
        /// </summary>
        /// <param name="reader">BinaryReader to deserialize from</param>
        /// <returns>OutboundStreamStableParameters object</returns>
        public static OutboundStreamStableParameters FromByteArray(BinaryReader reader)
        {
            var result = new OutboundStreamStableParameters();

            var cursor = 0;

            result.ReadBaseParameters(reader);
            Diagnostics.Assert(
                result.MetadataKind == StreamMetadataKind.OutboundStableParameters,
                "Unexpected StreamMetadataType when decoding OutboundStreamStableParameters.FromByteArray");

            result.MessageQuota = reader.ReadInt32();
            Diagnostics.Assert(result.MessageQuota > 0, "Non-positive message quota found when decoding OutboundStreamStableParameters.FromByteArray");
            cursor += sizeof(int);

            result.AcceptanceResponse = (StreamWireProtocolResponse)reader.ReadInt32();

            return(result);
        }