The trait `TyEncoder` is not implemented for `FileEncoder`

After reading Serialization in Rustc - Rust Compiler Development Guide, I attempted to write code for serializing/deserializing the MIR body by referring to

use crate::MirPass;
use rustc_middle::mir::*;
use rustc_middle::ty::TyCtxt;
use rustc_serialize::opaque::{FileEncoder, MemDecoder};
use rustc_serialize::{Decodable, Encodable};
use std::fs;

pub struct MirSerDe;

impl<'tcx> MirPass<'tcx> for MirSerDe {
    fn run_pass(&self, _tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
        let tmpfile = tempfile::NamedTempFile::new().unwrap();
        let tmpfile = tmpfile.path();

        // Serialize
        let mut encoder = FileEncoder::new(&tmpfile).unwrap();
        Encodable::encode(body, &mut encoder);

        // Deserialize
        let data = fs::read(&tmpfile).unwrap();
        let mut decoder = MemDecoder::new(&data[..], 0);
        let decoded = Decodable::decode(&mut decoder);

        assert_eq!(body, decoded);


$ ./ build --stage 1 --keep-stage 1 library
Building bootstrap
    Finished dev [unoptimized] target(s) in 0.02s
Building stage0 library artifacts (x86_64-unknown-linux-gnu)
    Finished release [optimized] target(s) in 0.06s
Building compiler artifacts (stage0 -> stage1, x86_64-unknown-linux-gnu)
   Compiling rustc_mir_transform v0.0.0 (/home/user/rust/compiler/rustc_mir_transform)
error[E0277]: the trait bound `FileEncoder: TyEncoder` is not satisfied
  --> compiler/rustc_mir_transform/src/
17 |         Encodable::encode(body, &mut encoder);
   |         -----------------       ^^^^^^^^^^^^ the trait `TyEncoder` is not implemented for `FileEncoder`
   |         |
   |         required by a bound introduced by this call
   = help: the trait `TyEncoder` is implemented for `CacheEncoder<'a, 'tcx>`
   = note: required for `rustc_middle::mir::Body<'tcx>` to implement `Encodable<FileEncoder>`

error[E0369]: binary operation `==` cannot be applied to type `&mut rustc_middle::mir::Body<'tcx>`
  --> /home/user/rust/library/core/src/macros/
36 | macro_rules! assert_eq {
   | ---------------------- in this expansion of `assert_eq!`
40 |                 if !(*left_val == *right_val) {
   |                      --------- ^^ ---------- _
   |                      |
   |                      &mut rustc_middle::mir::Body<'tcx>
  ::: compiler/rustc_mir_transform/src/
25 |         assert_eq!(body, decoded);
   |         ------------------------- in this macro invocation

Some errors have detailed explanations: E0277, E0369.
For more information about an error, try `rustc --explain E0277`.
error: could not compile `rustc_mir_transform` (lib) due to 2 previous errors
Build completed unsuccessfully in 0:00:01

Can you help me with how I should modify it?

Or is there another way to implement the logic described above?