diff --git a/lib/rs/src/protocol/compact.rs b/lib/rs/src/protocol/compact.rs
index d47df5d..319f28a 100644
--- a/lib/rs/src/protocol/compact.rs
+++ b/lib/rs/src/protocol/compact.rs
@@ -483,7 +483,7 @@
     ) -> crate::Result<()> {
         let elem_identifier = collection_type_to_u8(element_type);
         if element_count <= 14 {
-            let header = (element_count as u8) << 4 | elem_identifier;
+            let header = ((element_count as u8) << 4) | elem_identifier;
             self.write_byte(header)
         } else {
             let header = 0xF0 | elem_identifier;
diff --git a/lib/rs/test/Makefile.am b/lib/rs/test/Makefile.am
index 73fe156..f3c1c78 100644
--- a/lib/rs/test/Makefile.am
+++ b/lib/rs/test/Makefile.am
@@ -17,6 +17,12 @@
 # under the License.
 #
 
+SUBDIRS = .
+
+if WITH_TESTS
+SUBDIRS += fuzz
+endif
+
 THRIFT = $(top_builddir)/compiler/cpp/thrift
 
 stubs: thrifts/Base_One.thrift thrifts/Base_Two.thrift thrifts/Midlayer.thrift thrifts/Ultimate.thrift $(top_builddir)/test/Recursive.thrift $(THRIFT)
diff --git a/lib/rs/test/fuzz/.gitignore b/lib/rs/test/fuzz/.gitignore
new file mode 100644
index 0000000..80ed2f8
--- /dev/null
+++ b/lib/rs/test/fuzz/.gitignore
@@ -0,0 +1,6 @@
+target
+corpus
+artifacts
+coverage
+lib/fuzz_test.rs
+Cargo.lock
\ No newline at end of file
diff --git a/lib/rs/test/fuzz/Cargo.toml b/lib/rs/test/fuzz/Cargo.toml
new file mode 100644
index 0000000..38272b4
--- /dev/null
+++ b/lib/rs/test/fuzz/Cargo.toml
@@ -0,0 +1,86 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+# //
+#   http://www.apache.org/licenses/LICENSE-2.0
+# //
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+[package]
+name = "thrift-fuzz"
+version = "0.0.0"
+publish = false
+edition = "2021"
+
+[package.metadata]
+cargo-fuzz = true
+
+[lib]
+path = "lib/mod.rs"
+
+[dependencies]
+libfuzzer-sys = "0.4"
+uuid = { version = "1", features = ["arbitrary"] }
+arbitrary = { version = "1", features = ["derive"] }
+ordered-float = { version = "4.6.0", features = ["arbitrary"] }
+clap = { version = "4.5", features = ["derive"] }
+rand = "0.9"
+
+[dependencies.thrift]
+path = "../../../../lib/rs"
+
+[[bin]]
+name = "corpus_generator"
+path = "bin/corpus_generator.rs"
+
+[[bin]]
+name = "parse_compact"
+path = "fuzz_targets/parse_compact.rs"
+test = false
+doc = false
+bench = false
+
+[[bin]]
+name = "parse_binary"
+path = "fuzz_targets/parse_binary.rs"
+test = false
+doc = false
+bench = false
+
+[[bin]]
+name = "roundtrip_binary"
+path = "fuzz_targets/roundtrip_binary.rs"
+test = false
+doc = false
+bench = false
+
+[[bin]]
+name = "roundtrip_compact"
+path = "fuzz_targets/roundtrip_compact.rs"
+test = false
+doc = false
+bench = false
+
+# TODO (THRIFT-5891): Enable these once we fix round-trip correctness.
+# [[bin]]
+# name = "structured_roundtrip_compact"
+# path = "fuzz_targets/structured_roundtrip_compact.rs"
+# test = false
+# doc = false
+# bench = false
+
+# [[bin]]
+# name = "structured_roundtrip_binary"
+# path = "fuzz_targets/structured_roundtrip_binary.rs"
+# test = false
+# doc = false
+# bench = false
\ No newline at end of file
diff --git a/lib/rs/test/fuzz/Makefile.am b/lib/rs/test/fuzz/Makefile.am
new file mode 100644
index 0000000..4f49120
--- /dev/null
+++ b/lib/rs/test/fuzz/Makefile.am
@@ -0,0 +1,55 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+THRIFT = $(top_builddir)/compiler/cpp/thrift
+
+# These sed commands are needed to work around the fact that the generator doesn't
+# support the arbitrary crate yet.
+stubs: $(top_builddir)/test/FuzzTest.thrift $(THRIFT)
+	$(THRIFT) -out lib/ --gen rs $(top_builddir)/test/FuzzTest.thrift
+	sed -i 's/thrift::OrderedFloat/ordered_float::OrderedFloat/g' lib/fuzz_test.rs
+	sed -i 's/derive(/derive(arbitrary::Arbitrary, /g' lib/fuzz_test.rs
+
+check: stubs
+	$(CARGO) fmt --all -- --check
+	$(CARGO) clippy --all -- -D warnings
+	$(CARGO) build
+
+clean-local:
+	$(CARGO) clean
+	-$(RM) Cargo.lock
+	-$(RM) -r target/
+	-$(RM) -r corpus/
+	-$(RM) -r artifacts/
+	-$(RM) -r coverage/
+	-$(RM) lib/fuzz_test.rs
+
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+EXTRA_DIST = \
+	Cargo.toml \
+	lib/mod.rs \
+	fuzz_targets/parse_compact.rs \
+	fuzz_targets/parse_binary.rs \
+	fuzz_targets/roundtrip_binary.rs \
+	fuzz_targets/roundtrip_compact.rs \
+	fuzz_targets/structured_roundtrip_compact.rs \
+	fuzz_targets/structured_roundtrip_binary.rs \
+	bin/corpus_generator.rs
diff --git a/lib/rs/test/fuzz/README.md b/lib/rs/test/fuzz/README.md
new file mode 100644
index 0000000..3a8cd8f
--- /dev/null
+++ b/lib/rs/test/fuzz/README.md
@@ -0,0 +1,20 @@
+# Rust fuzzing README
+
+To build the fuzz targets, simply run `make check` in this directory
+
+These are standard cargo fuzz targets, so you can use the [standard cargo fuzz commands](https://rust-fuzz.github.io/book/introduction.html) to build and run them. You can also build with cargo fuzz directly after the initial build with `make check`, e.g. run `cargo fuzz run $fuzzer_name`
+
+We currently have six fuzz targets:
+
+* parse_compact -- fuzzes the deserialization of the Compact protocol
+* parse_binary -- fuzzes the deserialization of the Binary protocol
+* roundtrip_compact -- fuzzes the roundtrip of the Compact protocol (i.e. serializes and then deserializes and compares the result to the original)
+* roundtrip_binary -- fuzzes the roundtrip of the Binary protocol
+* structured_roundtrip_compact -- roundtrip, but starts from a valid compact thrift structure
+* structured_roundtrip_binary -- roundtrip, but starts from a valid binary thrift structure
+
+Some of the roundtrip fuzzers are structure aware, i.e. they generate mostly valid thrift structures, so we can also test serialization in addition to deserialization. We do have non structure aware roundtrip fuzzers as well, to match what's present in other languages (and also handle some corner cases).
+
+We also have a corpus generator script that can be used to generate a corpus of fuzz inputs. It can be run with `cargo run --bin corpus_generator -- --output-dir <output_dir> --protocol <binary|compact> --buffer-size <buffer_size> --random-size <random_size>`.
+
+This is useful for generating corpora for the parsing fuzzers, and can be used across all languages (for cases where the other languages don't have good native structure aware fuzzing support).
\ No newline at end of file
diff --git a/lib/rs/test/fuzz/bin/corpus_generator.rs b/lib/rs/test/fuzz/bin/corpus_generator.rs
new file mode 100644
index 0000000..ed104f8
--- /dev/null
+++ b/lib/rs/test/fuzz/bin/corpus_generator.rs
@@ -0,0 +1,167 @@
+use arbitrary::{Arbitrary, Unstructured};
+use clap::Parser;
+use std::fs::{self, File};
+use std::io::Read;
+use std::path::Path;
+use thrift::protocol::{
+    TBinaryOutputProtocol, TCompactOutputProtocol, TOutputProtocol, TSerializable,
+};
+use thrift::transport::TBufferChannel;
+use thrift_fuzz::fuzz_test::FuzzTest;
+
+#[derive(Parser)]
+#[command(author, version, about, long_about = None)]
+struct Args {
+    /// Input directory containing raw binary files (mutually exclusive with --generate)
+    #[arg(short, long, group = "input")]
+    input_dir: Option<String>,
+
+    /// Number of random files to generate (mutually exclusive with --input-dir)
+    #[arg(short, long, group = "input")]
+    generate: Option<usize>,
+
+    /// Output directory for serialized FuzzTest files
+    #[arg(short, long)]
+    output_dir: String,
+
+    /// Protocol to use for serialization (binary or compact)
+    #[arg(short, long)]
+    protocol: String,
+
+    /// Buffer size for serialization (default: 65536)
+    #[arg(short, long, default_value = "65536")]
+    buffer_size: usize,
+
+    /// Size of random byte vector for generation (default: 16384)
+    #[arg(long, default_value = "16384")]
+    random_size: usize,
+}
+
+fn serialize_fuzz_test(
+    fuzz_test: &FuzzTest,
+    protocol: &str,
+    buffer_size: usize,
+) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
+    let mut mem = TBufferChannel::with_capacity(buffer_size, buffer_size);
+    match protocol {
+        "binary" => {
+            let mut out_protocol = TBinaryOutputProtocol::new(&mut mem, true);
+            fuzz_test.write_to_out_protocol(&mut out_protocol)?;
+            out_protocol.flush()?;
+        }
+        "compact" => {
+            let mut out_protocol = TCompactOutputProtocol::new(&mut mem);
+            fuzz_test.write_to_out_protocol(&mut out_protocol)?;
+            out_protocol.flush()?;
+        }
+        _ => return Err("Invalid protocol specified. Use 'binary' or 'compact'".into()),
+    }
+    Ok(mem.write_bytes().to_vec())
+}
+
+fn convert_corpus_file(
+    input_path: &Path,
+    output_dir: &Path,
+    protocol: &str,
+    buffer_size: usize,
+) -> Result<(), Box<dyn std::error::Error>> {
+    // Read input file
+    let mut input_file = File::open(input_path)?;
+    let mut input_data = Vec::new();
+    input_file.read_to_end(&mut input_data)?;
+
+    // Create Unstructured instance for arbitrary
+    let mut unstructured = Unstructured::new(&input_data);
+
+    // Generate FuzzTest instance
+    if let Ok(fuzz_test) = FuzzTest::arbitrary(&mut unstructured) {
+        // Create output file path
+        let file_name = input_path
+            .file_name()
+            .ok_or("Invalid input filename")?
+            .to_str()
+            .ok_or("Invalid UTF-8 in filename")?;
+        let output_path = output_dir.join(file_name);
+
+        // Serialize and write to file
+        let serialized_data = serialize_fuzz_test(&fuzz_test, protocol, buffer_size)?;
+        fs::write(output_path, serialized_data)?;
+    }
+
+    Ok(())
+}
+
+fn generate_random_file(
+    output_dir: &Path,
+    index: usize,
+    protocol: &str,
+    buffer_size: usize,
+    random_size: usize,
+) -> Result<(), Box<dyn std::error::Error>> {
+    // Generate random bytes
+    let random_bytes: Vec<u8> = (0..random_size).map(|_| rand::random::<u8>()).collect();
+
+    // Create Unstructured instance for arbitrary
+    let mut unstructured = Unstructured::new(&random_bytes);
+
+    // Generate FuzzTest instance
+    if let Ok(fuzz_test) = FuzzTest::arbitrary(&mut unstructured) {
+        // Create output file path with index
+        let output_path = output_dir.join(format!("generated_{index}.bin"));
+
+        // Serialize and write to file
+        let serialized_data = serialize_fuzz_test(&fuzz_test, protocol, buffer_size)?;
+        fs::write(output_path, serialized_data)?;
+    }
+
+    Ok(())
+}
+
+fn main() -> Result<(), Box<dyn std::error::Error>> {
+    let args = Args::parse();
+
+    // Validate protocol
+    if args.protocol != "binary" && args.protocol != "compact" {
+        return Err("Invalid protocol specified. Use 'binary' or 'compact'".into());
+    }
+
+    // Create output directory if it doesn't exist
+    fs::create_dir_all(&args.output_dir)?;
+
+    match (args.input_dir, args.generate) {
+        (Some(input_dir), None) => {
+            // Process each file in the input directory
+            for entry in fs::read_dir(&input_dir)? {
+                let entry = entry?;
+                let path = entry.path();
+                if path.is_file() {
+                    if let Err(e) = convert_corpus_file(
+                        &path,
+                        Path::new(&args.output_dir),
+                        &args.protocol,
+                        args.buffer_size,
+                    ) {
+                        eprintln!("Error processing file {path:?}: {e}");
+                    }
+                }
+            }
+        }
+        (None, Some(num_files)) => {
+            // Generate random files
+            for i in 0..num_files {
+                if let Err(e) = generate_random_file(
+                    Path::new(&args.output_dir),
+                    i,
+                    &args.protocol,
+                    args.buffer_size,
+                    args.random_size,
+                ) {
+                    eprintln!("Error generating file {i}: {e}");
+                }
+            }
+        }
+        _ => return Err("Must specify either --input-dir or --generate".into()),
+    }
+
+    Ok(())
+}
diff --git a/lib/rs/test/fuzz/fuzz_targets/parse_binary.rs b/lib/rs/test/fuzz/fuzz_targets/parse_binary.rs
new file mode 100644
index 0000000..9e1444a
--- /dev/null
+++ b/lib/rs/test/fuzz/fuzz_targets/parse_binary.rs
@@ -0,0 +1,46 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#![no_main]
+
+use thrift::protocol::TBinaryInputProtocol;
+use thrift::protocol::TSerializable;
+use thrift::transport::TBufferChannel;
+use thrift::TConfiguration;
+use thrift_fuzz::fuzz_test::FuzzTest;
+
+fn run(data: &[u8]) -> thrift::Result<FuzzTest> {
+    // Add some limits to optimize fuzzing
+    let config = TConfiguration::builder()
+        .max_message_size(Some(data.len()))
+        .max_frame_size(Some(data.len()))
+        .max_container_size(Some(1024))
+        .max_string_size(Some(data.len()))
+        .build()
+        .unwrap();
+    // Create a buffer channel with enough capacity for our data
+    let mut mem = TBufferChannel::with_capacity(data.len(), data.len());
+    mem.set_readable_bytes(data);
+    let mut protocol = TBinaryInputProtocol::with_config(mem, true /* strict */, config);
+    FuzzTest::read_from_in_protocol(&mut protocol)
+}
+
+use libfuzzer_sys::fuzz_target;
+
+fuzz_target!(|data: &[u8]| {
+    let _ = run(data);
+});
diff --git a/lib/rs/test/fuzz/fuzz_targets/parse_compact.rs b/lib/rs/test/fuzz/fuzz_targets/parse_compact.rs
new file mode 100644
index 0000000..91cd532
--- /dev/null
+++ b/lib/rs/test/fuzz/fuzz_targets/parse_compact.rs
@@ -0,0 +1,46 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#![no_main]
+
+use thrift::protocol::TCompactInputProtocol;
+use thrift::protocol::TSerializable;
+use thrift::transport::TBufferChannel;
+use thrift::TConfiguration;
+use thrift_fuzz::fuzz_test::FuzzTest;
+
+fn run(data: &[u8]) -> thrift::Result<FuzzTest> {
+    // Add some limits to optimize fuzzing
+    let config = TConfiguration::builder()
+        .max_message_size(Some(data.len()))
+        .max_frame_size(Some(data.len()))
+        .max_container_size(Some(1024))
+        .max_string_size(Some(data.len()))
+        .build()
+        .unwrap();
+    // Create a buffer channel with enough capacity for our data
+    let mut mem = TBufferChannel::with_capacity(data.len(), data.len());
+    mem.set_readable_bytes(data);
+    let mut protocol = TCompactInputProtocol::with_config(mem, config);
+    FuzzTest::read_from_in_protocol(&mut protocol)
+}
+
+use libfuzzer_sys::fuzz_target;
+
+fuzz_target!(|data: &[u8]| {
+    let _ = run(data);
+});
diff --git a/lib/rs/test/fuzz/fuzz_targets/roundtrip_binary.rs b/lib/rs/test/fuzz/fuzz_targets/roundtrip_binary.rs
new file mode 100644
index 0000000..41b302b
--- /dev/null
+++ b/lib/rs/test/fuzz/fuzz_targets/roundtrip_binary.rs
@@ -0,0 +1,67 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#![no_main]
+
+use thrift::protocol::{
+    TBinaryInputProtocol, TBinaryOutputProtocol, TOutputProtocol, TSerializable,
+};
+use thrift::transport::TBufferChannel;
+use thrift::TConfiguration;
+use thrift_fuzz::fuzz_test::FuzzTest;
+
+fn run(data: &[u8]) -> thrift::Result<()> {
+    // Add some limits to optimize fuzzing
+    let config = TConfiguration::builder()
+        .max_message_size(Some(data.len()))
+        .max_frame_size(Some(data.len()))
+        .max_container_size(Some(1024))
+        .max_string_size(Some(data.len()))
+        .build()
+        .unwrap();
+    // First try to deserialize the raw input bytes
+    let mut mem = TBufferChannel::with_capacity(data.len(), data.len());
+    mem.set_readable_bytes(data);
+    let mut protocol =
+        TBinaryInputProtocol::with_config(mem, true /* strict */, config.clone());
+    let input = FuzzTest::read_from_in_protocol(&mut protocol)?;
+
+    // Now do the roundtrip test with the successfully deserialized object
+    let mut mem = TBufferChannel::with_capacity(data.len(), data.len());
+    let mut out_protocol = TBinaryOutputProtocol::new(&mut mem, true);
+    input.write_to_out_protocol(&mut out_protocol)?;
+    out_protocol.flush()?;
+
+    // Get the serialized bytes
+    let serialized = mem.write_bytes();
+
+    // Deserialize again
+    let mut mem = TBufferChannel::with_capacity(serialized.len(), serialized.len());
+    mem.set_readable_bytes(&serialized);
+    let mut in_protocol = TBinaryInputProtocol::with_config(mem, true, config);
+    let obj = FuzzTest::read_from_in_protocol(&mut in_protocol)?;
+
+    assert_eq!(input, obj);
+
+    Ok(())
+}
+
+use libfuzzer_sys::fuzz_target;
+
+fuzz_target!(|data: &[u8]| {
+    let _ = run(data);
+});
diff --git a/lib/rs/test/fuzz/fuzz_targets/roundtrip_compact.rs b/lib/rs/test/fuzz/fuzz_targets/roundtrip_compact.rs
new file mode 100644
index 0000000..e8c8c33
--- /dev/null
+++ b/lib/rs/test/fuzz/fuzz_targets/roundtrip_compact.rs
@@ -0,0 +1,66 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#![no_main]
+
+use thrift::protocol::{
+    TCompactInputProtocol, TCompactOutputProtocol, TOutputProtocol, TSerializable,
+};
+use thrift::transport::TBufferChannel;
+use thrift::TConfiguration;
+use thrift_fuzz::fuzz_test::FuzzTest;
+
+fn run(data: &[u8]) -> thrift::Result<()> {
+    // Add some limits to optimize fuzzing
+    let config = TConfiguration::builder()
+        .max_message_size(Some(data.len()))
+        .max_frame_size(Some(data.len()))
+        .max_container_size(Some(1024))
+        .max_string_size(Some(data.len()))
+        .build()
+        .unwrap();
+    // First try to deserialize the raw input bytes
+    let mut mem = TBufferChannel::with_capacity(data.len(), data.len());
+    mem.set_readable_bytes(data);
+    let mut protocol = TCompactInputProtocol::with_config(mem, config.clone());
+    let input = FuzzTest::read_from_in_protocol(&mut protocol)?;
+
+    // Now do the roundtrip test with the successfully deserialized object
+    let mut mem = TBufferChannel::with_capacity(data.len(), data.len());
+    let mut out_protocol = TCompactOutputProtocol::new(&mut mem);
+    input.write_to_out_protocol(&mut out_protocol)?;
+    out_protocol.flush()?;
+
+    // Get the serialized bytes
+    let serialized = mem.write_bytes();
+
+    // Deserialize again
+    let mut mem = TBufferChannel::with_capacity(serialized.len(), serialized.len());
+    mem.set_readable_bytes(&serialized);
+    let mut in_protocol = TCompactInputProtocol::with_config(mem, config);
+    let obj = FuzzTest::read_from_in_protocol(&mut in_protocol)?;
+
+    assert_eq!(input, obj);
+
+    Ok(())
+}
+
+use libfuzzer_sys::fuzz_target;
+
+fuzz_target!(|data: &[u8]| {
+    let _ = run(data);
+});
diff --git a/lib/rs/test/fuzz/fuzz_targets/structured_roundtrip_binary.rs b/lib/rs/test/fuzz/fuzz_targets/structured_roundtrip_binary.rs
new file mode 100644
index 0000000..47631b5
--- /dev/null
+++ b/lib/rs/test/fuzz/fuzz_targets/structured_roundtrip_binary.rs
@@ -0,0 +1,54 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#![no_main]
+
+use thrift::protocol::{
+    TBinaryInputProtocol, TBinaryOutputProtocol, TOutputProtocol, TSerializable,
+};
+use thrift::transport::TBufferChannel;
+use thrift_fuzz::fuzz_test::FuzzTest;
+
+const BUFFER_CAPACITY: usize = 65536;
+
+fn run(input: FuzzTest) -> thrift::Result<()> {
+    // TODO: Figure out a way to do this without hardcoding the buffer size
+    // Serialize
+    let mut mem = TBufferChannel::with_capacity(BUFFER_CAPACITY, BUFFER_CAPACITY);
+    let mut out_protocol = TBinaryOutputProtocol::new(&mut mem, true);
+    input.write_to_out_protocol(&mut out_protocol)?;
+    out_protocol.flush()?;
+
+    // Get the serialized bytes
+    let serialized = mem.write_bytes();
+
+    // Deserialize
+    let mut mem = TBufferChannel::with_capacity(serialized.len(), serialized.len());
+    mem.set_readable_bytes(&serialized);
+    let mut in_protocol = TBinaryInputProtocol::new(mem, true);
+    let obj = FuzzTest::read_from_in_protocol(&mut in_protocol)?;
+
+    assert_eq!(input, obj);
+
+    Ok(())
+}
+
+use libfuzzer_sys::fuzz_target;
+
+fuzz_target!(|input: FuzzTest| {
+    let _ = run(input);
+});
diff --git a/lib/rs/test/fuzz/fuzz_targets/structured_roundtrip_compact.rs b/lib/rs/test/fuzz/fuzz_targets/structured_roundtrip_compact.rs
new file mode 100644
index 0000000..ac87eb1
--- /dev/null
+++ b/lib/rs/test/fuzz/fuzz_targets/structured_roundtrip_compact.rs
@@ -0,0 +1,54 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#![no_main]
+
+use thrift::protocol::{
+    TCompactInputProtocol, TCompactOutputProtocol, TOutputProtocol, TSerializable,
+};
+use thrift::transport::TBufferChannel;
+use thrift_fuzz::fuzz_test::FuzzTest;
+
+const BUFFER_CAPACITY: usize = 65536;
+
+fn run(input: FuzzTest) -> thrift::Result<()> {
+    // TODO: Figure out a way to do this without hardcoding the buffer size
+    // Serialize
+    let mut mem = TBufferChannel::with_capacity(BUFFER_CAPACITY, BUFFER_CAPACITY);
+    let mut out_protocol = TCompactOutputProtocol::new(&mut mem);
+    input.write_to_out_protocol(&mut out_protocol)?;
+    out_protocol.flush()?;
+
+    // Get the serialized bytes
+    let serialized = mem.write_bytes();
+
+    // Deserialize
+    let mut mem = TBufferChannel::with_capacity(serialized.len(), serialized.len());
+    mem.set_readable_bytes(&serialized);
+    let mut in_protocol = TCompactInputProtocol::new(mem);
+    let obj = FuzzTest::read_from_in_protocol(&mut in_protocol)?;
+
+    assert_eq!(input, obj);
+
+    Ok(())
+}
+
+use libfuzzer_sys::fuzz_target;
+
+fuzz_target!(|input: FuzzTest| {
+    let _ = run(input);
+});
diff --git a/lib/rs/test/fuzz/lib/mod.rs b/lib/rs/test/fuzz/lib/mod.rs
new file mode 100644
index 0000000..71e1735
--- /dev/null
+++ b/lib/rs/test/fuzz/lib/mod.rs
@@ -0,0 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+pub mod fuzz_test;
