Skip to content

Commit 79c98b2

Browse files
authored
RUST-305 Fix deserialization of non-generic binary (#147)
1 parent 96d854b commit 79c98b2

File tree

3 files changed

+51
-4
lines changed

3 files changed

+51
-4
lines changed

src/decoder/serde.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,12 @@ impl<'de> Deserializer<'de> for Decoder {
311311
Bson::Null => visitor.visit_unit(),
312312
Bson::I32(v) => visitor.visit_i32(v),
313313
Bson::I64(v) => visitor.visit_i64(v),
314-
Bson::Binary(_, v) => visitor.visit_bytes(&v),
314+
Bson::Binary(BinarySubtype::Generic, v) => visitor.visit_bytes(&v),
315+
binary @ Bson::Binary(..) => visitor.visit_map(MapDecoder {
316+
iter: binary.to_extended_document().into_iter(),
317+
value: None,
318+
len: 2,
319+
}),
315320
_ => {
316321
let doc = value.to_extended_document();
317322
let len = doc.len();

src/encoder/serde.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use crate::decimal128::Decimal128;
1717
use crate::{
1818
bson::{Array, Bson, Document, TimeStamp, UtcDateTime},
1919
oid::ObjectId,
20+
spec::BinarySubtype,
2021
};
2122

2223
use super::{to_bson, EncoderError, EncoderResult};
@@ -62,7 +63,7 @@ impl Serialize for Bson {
6263
Bson::Null => serializer.serialize_unit(),
6364
Bson::I32(v) => serializer.serialize_i32(v),
6465
Bson::I64(v) => serializer.serialize_i64(v),
65-
Bson::Binary(_, ref v) => serializer.serialize_bytes(v),
66+
Bson::Binary(BinarySubtype::Generic, ref v) => serializer.serialize_bytes(v),
6667
_ => {
6768
let doc = self.to_extended_document();
6869
doc.serialize(serializer)
@@ -181,7 +182,6 @@ impl Serializer for Encoder {
181182
}
182183

183184
fn serialize_bytes(self, value: &[u8]) -> EncoderResult<Bson> {
184-
use crate::spec::BinarySubtype;
185185
// let mut state = self.serialize_seq(Some(value.len()))?;
186186
// for byte in value {
187187
// state.serialize_element(byte)?;

tests/serde.rs

+43-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#![allow(clippy::blacklisted_name)]
22

3-
use bson::{bson, doc, Bson, Decoder, Encoder};
3+
use bson::{bson, doc, spec::BinarySubtype, Bson, Decoder, Encoder};
44
use serde::{Deserialize, Serialize};
55
use serde_derive::{Deserialize, Serialize};
66

@@ -140,6 +140,48 @@ fn test_compat_u2f() {
140140
assert_eq!(de_foo, foo);
141141
}
142142

143+
#[test]
144+
fn test_binary_generic_roundtrip() {
145+
#[derive(Serialize, Deserialize, Debug, PartialEq)]
146+
pub struct Foo {
147+
data: Bson,
148+
}
149+
150+
let x = Foo {
151+
data: Bson::Binary(BinarySubtype::Generic, b"12345abcde".to_vec()),
152+
};
153+
154+
let b = bson::to_bson(&x).unwrap();
155+
assert_eq!(
156+
b.as_document().unwrap(),
157+
&doc! {"data": Bson::Binary(BinarySubtype::Generic, b"12345abcde".to_vec())}
158+
);
159+
160+
let f = bson::from_bson::<Foo>(b).unwrap();
161+
assert_eq!(x, f);
162+
}
163+
164+
#[test]
165+
fn test_binary_non_generic_roundtrip() {
166+
#[derive(Serialize, Deserialize, Debug, PartialEq)]
167+
pub struct Foo {
168+
data: Bson,
169+
}
170+
171+
let x = Foo {
172+
data: Bson::Binary(BinarySubtype::BinaryOld, b"12345abcde".to_vec()),
173+
};
174+
175+
let b = bson::to_bson(&x).unwrap();
176+
assert_eq!(
177+
b.as_document().unwrap(),
178+
&doc! {"data": Bson::Binary(BinarySubtype::BinaryOld, b"12345abcde".to_vec())}
179+
);
180+
181+
let f = bson::from_bson::<Foo>(b).unwrap();
182+
assert_eq!(x, f);
183+
}
184+
143185
#[test]
144186
fn test_byte_vec() {
145187
#[derive(Serialize, Debug, Eq, PartialEq)]

0 commit comments

Comments
 (0)