88 short_vec,
99 } ,
1010 serde:: {
11- de:: { self , Deserializer , SeqAccess , Visitor } ,
11+ de:: { self , Deserializer , SeqAccess , Unexpected , Visitor } ,
1212 ser:: { SerializeTuple , Serializer } ,
1313 Deserialize , Serialize ,
1414 } ,
@@ -198,7 +198,16 @@ impl<'de> Deserialize<'de> for MessagePrefix {
198198 formatter. write_str ( "message prefix byte" )
199199 }
200200
201- fn visit_u8 < E > ( self , byte : u8 ) -> Result < MessagePrefix , E > {
201+ // Serde's integer visitors bubble up to u64 so check the prefix
202+ // with this function instead of visit_u8. This approach is
203+ // necessary because serde_json directly calls visit_u64 for
204+ // unsigned integers.
205+ fn visit_u64 < E : de:: Error > ( self , value : u64 ) -> Result < MessagePrefix , E > {
206+ if value > u8:: MAX as u64 {
207+ Err ( de:: Error :: invalid_type ( Unexpected :: Unsigned ( value) , & self ) ) ?;
208+ }
209+
210+ let byte = value as u8 ;
202211 if byte & MESSAGE_VERSION_PREFIX != 0 {
203212 Ok ( MessagePrefix :: Versioned ( byte & !MESSAGE_VERSION_PREFIX ) )
204213 } else {
@@ -331,26 +340,32 @@ mod tests {
331340
332341 let mut message = LegacyMessage :: new ( & instructions, Some ( & id1) ) ;
333342 message. recent_blockhash = Hash :: new_unique ( ) ;
343+ let wrapped_message = VersionedMessage :: Legacy ( message. clone ( ) ) ;
334344
335- let bytes1 = bincode:: serialize ( & message) . unwrap ( ) ;
336- let bytes2 = bincode:: serialize ( & VersionedMessage :: Legacy ( message. clone ( ) ) ) . unwrap ( ) ;
345+ // bincode
346+ {
347+ let bytes = bincode:: serialize ( & message) . unwrap ( ) ;
348+ assert_eq ! ( bytes, bincode:: serialize( & wrapped_message) . unwrap( ) ) ;
337349
338- assert_eq ! ( bytes1, bytes2) ;
350+ let message_from_bytes: LegacyMessage = bincode:: deserialize ( & bytes) . unwrap ( ) ;
351+ let wrapped_message_from_bytes: VersionedMessage =
352+ bincode:: deserialize ( & bytes) . unwrap ( ) ;
339353
340- let message1: LegacyMessage = bincode:: deserialize ( & bytes1) . unwrap ( ) ;
341- let message2: VersionedMessage = bincode:: deserialize ( & bytes2) . unwrap ( ) ;
354+ assert_eq ! ( message, message_from_bytes) ;
355+ assert_eq ! ( wrapped_message, wrapped_message_from_bytes) ;
356+ }
342357
343- if let VersionedMessage :: Legacy ( message2 ) = message2 {
344- assert_eq ! ( message , message1 ) ;
345- assert_eq ! ( message1 , message2 ) ;
346- } else {
347- panic ! ( "should deserialize to legacy message" ) ;
358+ // serde_json
359+ {
360+ let string = serde_json :: to_string ( & message ) . unwrap ( ) ;
361+ let message_from_string : LegacyMessage = serde_json :: from_str ( & string ) . unwrap ( ) ;
362+ assert_eq ! ( message, message_from_string ) ;
348363 }
349364 }
350365
351366 #[ test]
352367 fn test_versioned_message_serialization ( ) {
353- let message = v0:: Message {
368+ let message = VersionedMessage :: V0 ( v0:: Message {
354369 header : MessageHeader {
355370 num_required_signatures : 1 ,
356371 num_readonly_signed_accounts : 0 ,
@@ -375,15 +390,14 @@ mod tests {
375390 accounts: vec![ 0 , 2 , 3 , 4 ] ,
376391 data: vec![ ] ,
377392 } ] ,
378- } ;
393+ } ) ;
379394
380- let bytes = bincode:: serialize ( & VersionedMessage :: V0 ( message. clone ( ) ) ) . unwrap ( ) ;
395+ let bytes = bincode:: serialize ( & message) . unwrap ( ) ;
381396 let message_from_bytes: VersionedMessage = bincode:: deserialize ( & bytes) . unwrap ( ) ;
397+ assert_eq ! ( message, message_from_bytes) ;
382398
383- if let VersionedMessage :: V0 ( message_from_bytes) = message_from_bytes {
384- assert_eq ! ( message, message_from_bytes) ;
385- } else {
386- panic ! ( "should deserialize to versioned message" ) ;
387- }
399+ let string = serde_json:: to_string ( & message) . unwrap ( ) ;
400+ let message_from_string: VersionedMessage = serde_json:: from_str ( & string) . unwrap ( ) ;
401+ assert_eq ! ( message, message_from_string) ;
388402 }
389403}
0 commit comments