/// <summary> /// Constructs a state representing a message root object. /// </summary> /// <param name="frame">the message</param> /// <returns></returns> public static DeserializerState CreateRoot(WireFrame frame) { var state = new DeserializerState(frame.Segments); state.DecodePointer(0); return(state); }
/// <summary> /// Sends a message over the stream. /// </summary> /// <param name="frame">Message to be sent</param> /// <exception cref="InvalidOperationException">The underlying stream does not support writing.</exception> /// <exception cref="ArgumentException">The message does not provide at least one segment, or one of its segments is empty.</exception> /// <exception cref="IOException">An I/O error occurs.</exception> /// <exception cref="ObjectDisposedException">This instance or stream is diposed.</exception> public void Send(WireFrame frame) { if (_writer == null) { throw new InvalidOperationException("Stream is not writable"); } if (frame.Segments == null) { throw new ArgumentException("Do not pass default(WireFrame)"); } if (frame.Segments.Count == 0) { throw new ArgumentException("Expected at least one segment"); } foreach (var segment in frame.Segments) { if (segment.Length == 0) { throw new ArgumentException("Segment must not have zero length"); } } lock (_writeLock) { foreach (var tracer in _tracers) { tracer.TraceFrame(FrameDirection.Tx, frame); } _writer.Write(frame.Segments.Count - 1); foreach (var segment in frame.Segments) { _writer.Write(segment.Length); } if ((frame.Segments.Count & 1) == 0) { // Padding _writer.Write(0); } foreach (var segment in frame.Segments) { #if NETSTANDARD2_0 var bytes = MemoryMarshal.Cast <ulong, byte>(segment.Span).ToArray(); #else var bytes = MemoryMarshal.Cast <ulong, byte>(segment.Span); #endif _writer.Write(bytes); } _writer.Flush(); } }
/// <summary> /// Sends a message over the stream. /// </summary> /// <param name="frame">Message to be sent</param> /// <exception cref="InvalidOperationException">The underlying stream does not support writing.</exception> /// <exception cref="ArgumentException">The message does not provide at least one segment, or one of its segments is empty.</exception> /// <exception cref="IOException">An I/O error occurs.</exception> /// <exception cref="ObjectDisposedException">This instance or stream is diposed.</exception> public void Send(WireFrame frame) { if (_writer == null) { throw new InvalidOperationException("Stream is not writable"); } if (frame.Segments == null) { throw new ArgumentException("Do not pass default(WireFrame)"); } if (frame.Segments.Count == 0) { throw new ArgumentException("Expected at least one segment"); } foreach (var segment in frame.Segments) { if (segment.Length == 0) { throw new ArgumentException("Segment must not have zero length"); } } lock (_writeLock) { _writer.Write(frame.Segments.Count - 1); foreach (var segment in frame.Segments) { _writer.Write(segment.Length); } if ((frame.Segments.Count & 1) == 0) { // Padding _writer.Write(0); } foreach (var segment in frame.Segments) { var bytes = MemoryMarshal.Cast <ulong, byte>(segment.Span); _writer.Write(bytes); } } }