This patch reverts parts of https://github.com/apache/opendal/commit/171b3c851a8a2e5c3868acdba21d5f27753eaded#diff-18ec5c54a5d98a62446336f93f20dd1b4becbda414e1b5bd9a9ee3047266c4a6

Index: opendal/Cargo.toml
===================================================================
--- opendal.orig/Cargo.toml
+++ opendal/Cargo.toml
@@ -303,7 +303,7 @@ version = ">= 0.12.6, < 0.14"
 optional = true
 
 [dependencies.quick-xml]
-version = "0.37"
+version = "0.36"
 features = [
     "serialize",
     "overlapped-lists",
Index: opendal/src/raw/serde_util.rs
===================================================================
--- opendal.orig/src/raw/serde_util.rs
+++ opendal/src/raw/serde_util.rs
@@ -28,11 +28,6 @@ use serde::de::{self};
 
 use crate::*;
 
-/// Parse xml serialize error into opendal::Error.
-pub fn new_xml_serialize_error(e: quick_xml::SeError) -> Error {
-    Error::new(ErrorKind::Unexpected, "serialize xml").set_source(e)
-}
-
 /// Parse xml deserialize error into opendal::Error.
 pub fn new_xml_deserialize_error(e: quick_xml::DeError) -> Error {
     Error::new(ErrorKind::Unexpected, "deserialize xml").set_source(e)
Index: opendal/src/services/azblob/core.rs
===================================================================
--- opendal.orig/src/services/azblob/core.rs
+++ opendal/src/services/azblob/core.rs
@@ -502,7 +502,7 @@ impl AzblobCore {
                 })
                 .collect(),
         })
-        .map_err(new_xml_serialize_error)?;
+        .map_err(new_xml_deserialize_error)?;
 
         req = req.header(CONTENT_LENGTH, content.len());
 
Index: opendal/src/services/cos/core.rs
===================================================================
--- opendal.orig/src/services/cos/core.rs
+++ opendal/src/services/cos/core.rs
@@ -467,7 +467,7 @@ impl CosCore {
         let req = Request::post(&url);
 
         let content = quick_xml::se::to_string(&CompleteMultipartUploadRequest { part: parts })
-            .map_err(new_xml_serialize_error)?;
+            .map_err(new_xml_deserialize_error)?;
         // Make sure content length has been set to avoid post with chunked encoding.
         let req = req.header(CONTENT_LENGTH, content.len());
         // Set content-type to `application/xml` to avoid mixed with form post.
Index: opendal/src/services/gcs/core.rs
===================================================================
--- opendal.orig/src/services/gcs/core.rs
+++ opendal/src/services/gcs/core.rs
@@ -668,7 +668,7 @@ impl GcsCore {
         let req = Request::post(&url);
 
         let content = quick_xml::se::to_string(&CompleteMultipartUploadRequest { part: parts })
-            .map_err(new_xml_serialize_error)?;
+            .map_err(new_xml_deserialize_error)?;
         // Make sure content length has been set to avoid post with chunked encoding.
         let req = req.header(CONTENT_LENGTH, content.len());
         // Set content-type to `application/xml` to avoid mixed with form post.
Index: opendal/src/services/obs/core.rs
===================================================================
--- opendal.orig/src/services/obs/core.rs
+++ opendal/src/services/obs/core.rs
@@ -409,7 +409,7 @@ impl ObsCore {
         let content = quick_xml::se::to_string(&CompleteMultipartUploadRequest {
             part: parts.to_vec(),
         })
-        .map_err(new_xml_serialize_error)?;
+        .map_err(new_xml_deserialize_error)?;
         // Make sure content length has been set to avoid post with chunked encoding.
         let req = req.header(CONTENT_LENGTH, content.len());
         // Set content-type to `application/xml` to avoid mixed with form post.
Index: opendal/src/services/oss/core.rs
===================================================================
--- opendal.orig/src/services/oss/core.rs
+++ opendal/src/services/oss/core.rs
@@ -598,7 +598,7 @@ impl OssCore {
                 })
                 .collect(),
         })
-        .map_err(new_xml_serialize_error)?;
+        .map_err(new_xml_deserialize_error)?;
 
         // Make sure content length has been set to avoid post with chunked encoding.
         let req = req.header(CONTENT_LENGTH, content.len());
@@ -708,7 +708,7 @@ impl OssCore {
         let content = quick_xml::se::to_string(&CompleteMultipartUploadRequest {
             part: parts.to_vec(),
         })
-        .map_err(new_xml_serialize_error)?;
+        .map_err(new_xml_deserialize_error)?;
         // Make sure content length has been set to avoid post with chunked encoding.
         let req = req.header(CONTENT_LENGTH, content.len());
         // Set content-type to `application/xml` to avoid mixed with form post.
Index: opendal/src/services/s3/core.rs
===================================================================
--- opendal.orig/src/services/s3/core.rs
+++ opendal/src/services/s3/core.rs
@@ -925,7 +925,7 @@ impl S3Core {
         req = self.insert_sse_headers(req, true);
 
         let content = quick_xml::se::to_string(&CompleteMultipartUploadRequest { part: parts })
-            .map_err(new_xml_serialize_error)?;
+            .map_err(new_xml_deserialize_error)?;
         // Make sure content length has been set to avoid post with chunked encoding.
         req = req.header(CONTENT_LENGTH, content.len());
         // Set content-type to `application/xml` to avoid mixed with form post.
@@ -993,7 +993,7 @@ impl S3Core {
                 })
                 .collect(),
         })
-        .map_err(new_xml_serialize_error)?;
+        .map_err(new_xml_deserialize_error)?;
 
         // Make sure content length has been set to avoid post with chunked encoding.
         req = req.header(CONTENT_LENGTH, content.len());
