@@ -45,13 +45,22 @@ public void Write(object data)
4545 if ( ! _enabled )
4646 throw new ObjectDisposedException ( nameof ( JsonDtoChannel ) ) ;
4747
48- using var streamWriter = new StreamWriter ( _dataStream , Encoding . UTF8 , 1024 , leaveOpen : true ) ;
49- using var writer = new JsonTextWriter ( streamWriter ) ;
48+ var content = JsonConvert . SerializeObject ( data ) ;
49+ var contentBytes = Encoding . UTF8 . GetBytes ( content ) ;
5050
51- JsonSerializer . CreateDefault ( ) . Serialize ( writer , data ) ;
52- writer . Flush ( ) ;
53- }
51+ using ( var bufferedStream = new MemoryStream ( contentBytes . Length + sizeof ( int ) ) )
52+ {
53+ using ( var writer = new BinaryWriter ( bufferedStream , Encoding . UTF8 ) )
54+ {
55+ writer . Write ( contentBytes . Length ) ;
56+ writer . Write ( contentBytes , 0 , contentBytes . Length ) ;
5457
58+ bufferedStream . Position = 0 ;
59+ bufferedStream . CopyTo ( _dataStream ) ;
60+ }
61+ }
62+ }
63+
5564 public T Read < T > ( )
5665 {
5766 return ( T ) Read ( ) ;
@@ -61,13 +70,36 @@ public object Read()
6170 {
6271 if ( ! _enabled )
6372 throw new ObjectDisposedException ( nameof ( JsonDtoChannel ) ) ;
64-
65- using var streamReader = new StreamReader ( _dataStream , Encoding . UTF8 , false , 1024 , leaveOpen : true ) ;
66- using var reader = new JsonTextReader ( streamReader ) ;
6773
68- return JsonSerializer . CreateDefault ( ) . Deserialize < TcpProtocolDtoBase > ( reader ) ;
74+ using ( var socketReader = new BinaryReader ( _dataStream , Encoding . UTF8 , true ) )
75+ {
76+ var contentLength = socketReader . ReadInt32 ( ) ;
77+ var contentBuffer = new byte [ contentLength ] ;
78+ ReadStream ( socketReader , contentBuffer , contentLength ) ;
79+
80+ using ( var textReader = new StreamReader ( new MemoryStream ( contentBuffer ) , Encoding . UTF8 , false ) )
81+ {
82+ using var reader = new JsonTextReader ( textReader ) ;
83+ return JsonSerializer . CreateDefault ( ) . Deserialize < TcpProtocolDtoBase > ( reader ) ;
84+ }
85+ }
6986 }
7087
88+ private void ReadStream ( BinaryReader reader , byte [ ] buffer , int length )
89+ {
90+ int readPosition = 0 ;
91+ int bytesReceived = 0 ;
92+
93+ while ( bytesReceived < length )
94+ {
95+ bytesReceived = reader . Read ( buffer , readPosition , length - bytesReceived ) ;
96+ if ( bytesReceived == 0 )
97+ throw new IOException ( "Unexpected end of stream" ) ;
98+
99+ readPosition += bytesReceived ;
100+ }
101+ }
102+
71103 public bool Connected => _enabled && ( _tcpClient ? . Connected ?? true ) ;
72104 }
73105}
0 commit comments