2012-02-15 41 views
77

.NET Framework giao với System.Runtime.Serialization.Json.DataContractJsonSerializerSystem.Web.Script.Serialization.JavaScriptSerializer, cả hai đều de/serialize JSON. Làm cách nào để biết khi nào nên chọn một trong các loại này so với loại kia? MSDN không làm cho nó rõ ràng những lợi thế tương đối của họ là gì.Sự khác nhau giữa DataContractJsonSerializer và JavaScriptSerializer là gì?

Chúng tôi có một số dự án tiêu thụ hoặc phát ra JSON và lớp được chọn cho mỗi dự án đã phụ thuộc vào ý kiến ​​của nhà phát triển chính về từng dự án. Một số là đơn giản, hai có logic phức tạp liên quan đến sản xuất các loại quản lý từ JSON (các loại không bản đồ chặt chẽ với các dòng) nhưng không có bất kỳ sự nhấn mạnh về tốc độ, một đòi hỏi tốc độ. Không có gì tương tác với WCF, ít nhất là bây giờ.

Trong khi tôi quan tâm đến các thư viện thay thế, tôi hy vọng rằng ai đó cũng có thể có câu trả lời cho câu hỏi của tôi.

+8

sử dụng Json.Net http://json.codeplex.com/. Bạn sẽ có quyền kiểm soát nhiều hơn đối với quá trình tuần tự hóa/deserialization. –

+0

Phụ thuộc vào cách bạn đang sử dụng nó. DataContractJsonSerializer có xu hướng hoạt động tốt với WCF. JavaScriptSerializer đơn giản hơn rất nhiều. Bạn đang cố làm gì vậy? – jrummell

+0

Sử dụng ServiceStack.JsonSerializer - đó là nhanh nhất. Nhưng nó không tôn trọng thuộc tính [ScriptIgnore]. Không phải là một vấn đề nếu bạn không cần nó. Xem một cuộc thảo luận dài về nó ở đây: http://stackoverflow.com/questions/9150920/preventing-stackoverflowexception-while-serializing-ef-object-graph-into-json –

Trả lời

57

DataContractJsonSerializer được thiết kế để sử dụng với các ứng dụng máy khách WCF nơi các kiểu được tuần tự hóa thường là các lớp POCO với thuộc tính DataContract được áp dụng cho chúng. Không có DataContract, không serialization. Cơ chế ánh xạ của WCF làm cho việc gửi và nhận rất đơn giản, nhưng chỉ khi nền tảng của bạn là đồng nhất. Nếu bạn bắt đầu trộn trong các bộ công cụ khác nhau, chương trình của bạn có thể đi ngang.

Trình JavaScriptSerializer có thể tuần tự hóa mọi loại, bao gồm các loại ẩn danh (một chiều) và thực hiện theo cách phù hợp hơn. Bạn mất "automagic" của WCF, nhưng bạn có được nhiều tùy chọn tích hợp hơn.

Như bạn có thể thấy bằng các nhận xét, có rất nhiều tùy chọn cho việc sắp xếp AJAX và để giải quyết các câu hỏi về tốc độ và bảo trì của bạn, có thể điều tra chúng để tìm giải pháp đáp ứng nhu cầu của tất cả các nhóm, để giảm các vấn đề về bảo trì trong thời gian dài vì mọi người làm mọi thứ theo cách riêng của họ.

2014-04-07 CẬP NHẬT: Tôi khuyên bạn nên sử dụng JSON.NET nếu có thể. Xem http://james.newtonking.com/json So sánh tính năng để xem xét 3 thư viện được xem xét trong câu hỏi này.

2015-05-26 CẬP NHẬT: Nếu công ty của bạn yêu cầu sử dụng các sản phẩm được cấp phép thương mại hoặc bạn cần mọi hiệu suất cuối cùng, bạn cũng có thể muốn xem https://servicestack.net/.

+2

Sự khác nhau về hiệu suất * serialization giữa hai trong số chúng là gì? Cho phép nói rằng họ sẽ serialize cùng một số thực thể với cùng một số thuộc tính? –

2

Cá nhân, tôi nghĩ rằng DataContractJsonSerializer các chuyên gia về kỹ thuật quá mức. Tôi sẽ bỏ qua nó và đi với JavaScriptSerializer. Trong trường hợp không có JavaScriptSerializer, bạn có thể sử dụng FridayThe13th (thư viện tôi đã viết; p).

+0

Json.Net ở mọi nơi. .Net 2.0, 3.5, 4.0, Silverlight, WindowsPhone –

18

Cả hai đều thực hiện tương tự nhưng sử dụng cơ sở hạ tầng rất khác nhau, do đó áp dụng các hạn chế khác nhau cho các lớp bạn muốn sắp xếp/deserialize và cung cấp mức độ linh hoạt khác nhau trong việc điều chỉnh quá trình tuần tự hóa/deserialization.

Đối với DataContractJsonSerializer bạn phải đánh dấu tất cả các lớp bạn muốn tuần tự hóa bằng cách sử dụng DataContract atrtibute và tất cả thành viên sử dụng thuộc tính DataMember. Cũng như nếu một số lớp học của bạn có thành viên enum, thì các enums cũng phải được đánh dấu là DataContract và mỗi thành viên enum - với thuộc tính EnumMember. Ngoài ra DataContractJsonSerializer cho phép bạn kiểm soát tốt toàn bộ quá trình tuần tự hóa/deserialization bằng cách thay đổi các loại logic phân giải và thay thế các loại mà bạn tuần tự hóa với người thay thế.

Đối với JavaScriptSerializer bạn phải cung cấp hàm tạo tham số nếu bạn có kế hoạch deserializing các đối tượng từ chuỗi json.

Đối với tôi, tôi thường sử dụng JavaScriptSerializer trong logic trình bày, trong đó có một mô hình đơn giản tôi muốn kết xuất trong Json cùng với trang, mà không cần thêm yêu cầu ajax. Và tôi thậm chí thường không phải deserialize chúng trở lại C# - vì vậy không có chi phí ở tất cả. Nhưng nếu nó tồn tại logic, nơi tôi muốn lưu các đối tượng vào một kho lưu trữ dữ liệu (thường là không có sql), để tải chúng sau này, tôi thích sử dụng DataContractJsonSerializer vì chi phí của việc đưa các thuộc tính có giá trị linh hoạt trong việc điều chỉnh quá trình tuần tự hóa/deserialization , đặc biệt là khi tải dữ liệu được tuần tự hóa vào các đối tượng của phiên bản mới hơn, với các định nghĩa được cập nhật

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