@@ -61,17 +61,78 @@ impl<T, C: Container> Message<T, C> {
6161impl < T , C > crate :: communication:: Bytesable for Message < T , C >
6262where
6363 T : Serialize + for < ' a > Deserialize < ' a > ,
64- C : Serialize + for < ' a > Deserialize < ' a > ,
64+ C : ContainerBytes ,
6565{
66- fn from_bytes ( bytes : crate :: bytes:: arc:: Bytes ) -> Self {
67- :: bincode:: deserialize ( & bytes[ ..] ) . expect ( "bincode::deserialize() failed" )
66+ fn from_bytes ( mut bytes : crate :: bytes:: arc:: Bytes ) -> Self {
67+ let mut slice = & bytes[ ..] ;
68+ let from: usize = :: bincode:: deserialize ( & mut slice) . expect ( "bincode::deserialize() failed" ) ;
69+ let seq: usize = :: bincode:: deserialize ( & mut slice) . expect ( "bincode::deserialize() failed" ) ;
70+ let time: T = :: bincode:: deserialize ( & mut slice) . expect ( "bincode::deserialize() failed" ) ;
71+ let bytes_read = bytes. len ( ) - slice. len ( ) ;
72+ bytes. extract_to ( bytes_read) ;
73+ let data: C = ContainerBytes :: from_bytes ( bytes) ;
74+ Self { time, data, from, seq }
6875 }
6976
7077 fn length_in_bytes ( & self ) -> usize {
71- :: bincode:: serialized_size ( & self ) . expect ( "bincode::serialized_size() failed" ) as usize
78+ :: bincode:: serialized_size ( & self . from ) . expect ( "bincode::serialized_size() failed" ) as usize +
79+ :: bincode:: serialized_size ( & self . seq ) . expect ( "bincode::serialized_size() failed" ) as usize +
80+ :: bincode:: serialized_size ( & self . time ) . expect ( "bincode::serialized_size() failed" ) as usize +
81+ self . data . length_in_bytes ( )
7282 }
7383
7484 fn into_bytes < W : :: std:: io:: Write > ( & self , writer : & mut W ) {
75- :: bincode:: serialize_into ( writer, & self ) . expect ( "bincode::serialize_into() failed" ) ;
85+ :: bincode:: serialize_into ( & mut * writer, & self . from ) . expect ( "bincode::serialize_into() failed" ) ;
86+ :: bincode:: serialize_into ( & mut * writer, & self . seq ) . expect ( "bincode::serialize_into() failed" ) ;
87+ :: bincode:: serialize_into ( & mut * writer, & self . time ) . expect ( "bincode::serialize_into() failed" ) ;
88+ self . data . into_bytes ( & mut * writer) ;
7689 }
77- }
90+ }
91+
92+
93+ /// A container-oriented version of `Bytesable` that can be implemented here for `Vec<T>` and other containers.
94+ pub trait ContainerBytes {
95+ /// Wrap bytes as `Self`.
96+ fn from_bytes ( bytes : crate :: bytes:: arc:: Bytes ) -> Self ;
97+
98+ /// The number of bytes required to serialize the data.
99+ fn length_in_bytes ( & self ) -> usize ;
100+
101+ /// Writes the binary representation into `writer`.
102+ fn into_bytes < W : :: std:: io:: Write > ( & self , writer : & mut W ) ;
103+ }
104+
105+ mod implementations {
106+
107+ use serde:: { Serialize , Deserialize } ;
108+ use crate :: dataflow:: channels:: ContainerBytes ;
109+
110+ impl < T : Serialize + for < ' a > Deserialize < ' a > > ContainerBytes for Vec < T > {
111+ fn from_bytes ( bytes : crate :: bytes:: arc:: Bytes ) -> Self {
112+ :: bincode:: deserialize ( & bytes[ ..] ) . expect ( "bincode::deserialize() failed" )
113+ }
114+
115+ fn length_in_bytes ( & self ) -> usize {
116+ :: bincode:: serialized_size ( & self ) . expect ( "bincode::serialized_size() failed" ) as usize
117+ }
118+
119+ fn into_bytes < W : :: std:: io:: Write > ( & self , writer : & mut W ) {
120+ :: bincode:: serialize_into ( writer, & self ) . expect ( "bincode::serialize_into() failed" ) ;
121+ }
122+ }
123+
124+ use crate :: container:: flatcontainer:: FlatStack ;
125+ impl < T : Serialize + for < ' a > Deserialize < ' a > + crate :: container:: flatcontainer:: Region > ContainerBytes for FlatStack < T > {
126+ fn from_bytes ( bytes : crate :: bytes:: arc:: Bytes ) -> Self {
127+ :: bincode:: deserialize ( & bytes[ ..] ) . expect ( "bincode::deserialize() failed" )
128+ }
129+
130+ fn length_in_bytes ( & self ) -> usize {
131+ :: bincode:: serialized_size ( & self ) . expect ( "bincode::serialized_size() failed" ) as usize
132+ }
133+
134+ fn into_bytes < W : :: std:: io:: Write > ( & self , writer : & mut W ) {
135+ :: bincode:: serialize_into ( writer, & self ) . expect ( "bincode::serialize_into() failed" ) ;
136+ }
137+ }
138+ }
0 commit comments