46

Tôi đã dành phần lớn thời gian vào tuần trước để làm việc theo chuỗi. Trong thời gian đó, tôi đã tìm thấy nhiều ví dụ sử dụng BinaryFormatter hoặc XmlSerializer. Thật không may, những gì tôi đã không tìm thấy là bất kỳ ví dụ chi tiết toàn diện sự khác biệt giữa hai.Sự khác biệt giữa XmlSerializer và BinaryFormatter

Nguồn gốc của sự tò mò của tôi nằm ở lý do tại sao BinaryFormatter có thể deserialize trực tiếp đến một giao diện trong khi XmlSerializer thì không. Jon Skeet trong câu trả lời cho "casting to multiple (unknown types) at runtime" cung cấp ví dụ về tuần tự nhị phân trực tiếp cho giao diện. Stan R. cung cấp cho tôi phương tiện hoàn thành mục tiêu của tôi bằng cách sử dụng XmlSerializer trong câu trả lời của mình cho "XML Object Deserialization to Interface".

Ngoài sự rõ ràng của BinaryFormatter sử dụng tuần tự hóa nhị phân trong khi XmlSerializer sử dụng XML, tôi muốn hiểu đầy đủ hơn về những khác biệt cơ bản. Khi nào nên sử dụng cái này hay cái kia và những ưu và nhược điểm của mỗi cái.

Trả lời

87

Lý do một Binary formatter có thể deserialize trực tiếp đến một kiểu giao diện là bởi vì khi một đối tượng là ban đầu serialized đến một siêu dữ liệu dòng nhị phân chứa loại và lắp ráp thông tin bị mắc kẹt với các dữ liệu đối tượng. Điều này có nghĩa rằng khi trình định dạng nhị phân deserializes đối tượng nó biết loại của nó, xây dựng các đối tượng chính xác và sau đó bạn có thể đúc nó vào một loại giao diện mà đối tượng thực hiện.

Trình tự tuần tự XML chỉ tuần tự hóa vào một lược đồ và chỉ tuần tự hóa các trường công khai và các giá trị của đối tượng và không có thông tin loại nào khác (ví dụ: giao diện loại triển khai).

Đây là một bài đăng hay, .NET Serialization, so sánh BinaryFormatter, SoapFormatterXmlSerializer. Tôi khuyên bạn nên xem bảng sau, ngoài các trình tuần tự được đề cập trước đây, bao gồm DataContractSerializer, NetDataContractSerializerprotobuf-net.

Serialization Comparison

+1

Bảng tốt. Tôi luôn tìm thấy sự thiếu hụt Generics gây phiền nhiễu SOAP. –

+1

@ahsteele - bạn là một ngôi sao –

+5

Tôi tin rằng phân loại "hiệu suất tốt nhất" là sai. Định dạng nhị phân là serializer thực hiện tồi tệ nhất trong .net (ngoại trừ có thể là trình định dạng xà phòng). Ít nhất đó là điểm chuẩn nhất cho thấy: http://blogs.msdn.com/b/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx, http: // james. newtonking.com/archive/2010/01/01/net-serialization-performance-comparison.aspx, http://techmikael.blogspot.com/2010/01/net-serialization-performance.html – joniba

1

XmlSerializer nối tiếp loại bằng cách đọc tất cả các thuộc tính của loại có cả trình thu thập công khai và bộ công khai (và cũng có bất kỳ trường công khai nào). Theo nghĩa này, XmlSerializer serializes/deserializes "public view" của cá thể.

Trình định dạng nhị phân, ngược lại, tuần tự hóa một loại bằng cách tuần tự hóa "nội bộ" của cá thể, tức là các trường của nó. Bất kỳ trường nào không được đánh dấu là [NonSerialized] sẽ được tuần tự hóa thành luồng nhị phân. Bản thân loại này phải được đánh dấu là [Serializable] vì phải có bất kỳ trường nội bộ nào cũng được sắp xếp theo thứ tự.

2

Trình nối tiếp XML tạo XML và cũng là một lược đồ XML (ngầm). Nó sẽ tạo ra XML phù hợp với lược đồ này.

Một ngụ ý là nó sẽ không tuần tự hóa bất kỳ thứ gì không thể được mô tả trong Lược đồ XML. Ví dụ, không có cách nào để phân biệt giữa một danh sách và một mảng trong Lược đồ XML, do đó, Lược đồ XML do trình nối tiếp tạo ra có thể được diễn giải theo một trong hai cách.

Serial serialization (trong đó BinaryFormatter là một phần của) serializes các loại .NET thực tế sang phía bên kia, vì vậy nếu bạn gửi List<int>, phía bên kia sẽ nhận được List<int>.

Điều đó rõ ràng hoạt động tốt hơn nếu phía bên kia đang chạy .NET.

+0

hi John, tôi đã tự hỏi nếu xử lý một Danh sách không phải là một vấn đề, bạn vẫn thích BinaryFormatter? – paradisonoir

+0

Không. Danh sách chỉ là một ví dụ. Hai trường hợp sử dụng hoàn toàn khác nhau. BTW, xem SoapFormatter.Thời gian chạy tuần tự hóa (hai trình định dạng) hoàn toàn khác với XML serialization, rất khác với việc tuần tự hóa dữ liệu của Hợp đồng. –

0

Tôi đoán một trong những điều quan trọng nhất là việc tuần tự hóa nhị phân có thể tuần tự hóa cả thành viên công khai và riêng tư, trong khi một số khác chỉ hoạt động với các thành viên công cộng.

Ở đây, nó cung cấp một so sánh rất hữu ích giữa hai điều này về kích thước. Đó là một vấn đề rất quan trọng, bởi vì bạn có thể gửi đối tượng được tuần tự hóa của bạn đến một máy từ xa.

http://www.nablasoft.com/alkampfer/index.php/2008/10/31/binary-versus-xml-serialization-size/

6

Chỉ cần cân nhắc trong ...

Sự khác biệt rõ ràng giữa hai là "nhị phân vs xml", nhưng nó đi sâu hơn rất nhiều so với rằng:

  • lĩnh vực (BinaryFormatter = bf) vs công khai thành viên (thường là thuộc tính) (XmlSerializer = xs)
  • loại siêu dữ liệu dựa trên (bf) so với hợp đồng-ba sed (xs)
  • phiên bản giòn (bf) vs phiên bản-tolerant (xs)
  • "đồ thị" (bf) vs "cây" (xs)
  • NET cụ thể (bf) vs xách tay (xs)
  • đục (bf) vs con người có thể đọc được (xs)

là một cuộc thảo luận về lý do tại sao BinaryFormatter có thể giòn, see here.

Không thể thảo luận vấn đề nào lớn hơn; tất cả các siêu dữ liệu loại trong BinaryFormatter có thể làm cho nó lớn hơn. Và XmlSerializer có thể hoạt động rất tốt với tính năng nén như gzip.

Tuy nhiên, có thể lấy điểm mạnh của từng loại; ví dụ: Google có định dạng tuần tự hóa dữ liệu riêng, "bộ đệm giao thức". Đây là:

  • hợp đồng dựa trên
  • cầm tay (xem list of implementations)
  • phiên bản chịu
  • cây dựa trên
  • đục (mặc dù có những công cụ để hiển thị dữ liệu khi kết hợp với một .proto)
  • thường là "contract first", nhưng một số triển khai cho phép các hợp đồng tiềm ẩn dựa trên phản ánh

Nhưng quan trọng là dữ liệu rất dày đặc (không có siêu dữ liệu loại, biểu diễn nhị phân thuần túy, thẻ ngắn, thủ thuật như mã hóa cơ sở 7 biến thể) và rất hiệu quả để xử lý (không có cấu trúc xml phức tạp, không có chuỗi nào khớp với thành viên, v.v.)

Tôi có thể hơi thiên vị; Tôi duy trì một trong những triển khai (bao gồm một số việc phù hợp cho C# /. NET), nhưng bạn sẽ lưu ý rằng tôi không có được liên kết với bất kỳ việc thực hiện cụ thể nào; định dạng đứng dưới giá trị riêng của nó ;-p

Các vấn đề liên quan