Sự khác biệt giữa DataContractJsonSerializer và JavaScriptSerializer là gì?


88

.NET Framework đi kèm 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 những loại này hơn loại kia? MSDN không nói rõ lợi thế tương đối của chúng là gì.

Chúng tôi có một số dự án sử dụng hoặc phát ra JSON và lớp được chọn cho mỗi dự án cho đến nay phụ thuộc vào ý kiến ​​của nhà phát triển chính về mỗi dự án. Một số đơn giản, hai có logic phức tạp liên quan đến việc tạo ra các kiểu được quản lý từ JSON (các kiểu không ánh xạ chặt chẽ với các luồng) nhưng không có bất kỳ sự nhấn mạnh nào về tốc độ, một loại yêu cầu tốc độ. Không có tương tác với WCF, ít nhất là cho đến 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 json.codeplex.com . Bạn sẽ có nhiều quyền kiểm soát hơn đối với quá trình tuần tự hóa / giải mã hóa.
LB

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

Sử dụng ServiceStack.JsonSerializer - nó 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: stackoverflow.com/questions/9150920/...
Ofer Zelig

18
Tại sao mọi người đưa câu trả lời của họ vào bình luận? Thật khó để bỏ phiếu cho các câu trả lời hoặc nhận xét về chúng.
Justin R.

3
@JustinR. có lẽ bởi vì một số cảnh sát ở đây, những người sẽ phản đối câu trả lời một dòng và nói: "Đây nên là một bình luận".
nawfal

Câu trả lời:


68

DataContractJsonSerializer được thiết kế để sử dụng với các ứng dụng khách WCF trong đó các loại 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 có tuần tự hóa. 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 đồng nhất. Nếu bạn bắt đầu trộn các bộ công cụ khác nhau, chương trình của bạn có thể đi ngang.

JavaScriptSerializer có thể tuần tự hóa bất kỳ loại nào, kể cả các loại ẩn danh (một cách) và làm như vậy theo cách phù hợp hơn. Bạn mất tính "tự động hóa" 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 qua các nhận xét, có rất nhiều tùy chọn hiện có để tuần tự hóa AJAX và để giải quyết các câu hỏi về tốc độ so với khả năng bảo trì của bạn, bạn nên điều tra chúng để tìm ra 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ề khả năng bảo trì trong dài hạn vì mọi người đều làm mọi việc 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 bạn có thể. Xem http://james.newtonking.com/json So sánh tính năng để biết đánh giá về 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ó thể cấp phép thương mại hoặc bạn cần từng chút hiệu suất cuối cùng, bạn cũng có thể muốn xem https://servicestack.net/ .


2
Sự khác biệt về hiệu suất tuần tự hóa giữa hai người trong số họ là gì? Giả sử họ sẽ tuần tự hóa cùng một số thực thể với cùng một số thuộc tính?
Adrian Salazar

20

Cả hai đều hoạt động gần giống nhau 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 đối với các lớp bạn muốn tuần tự hóa / giải không khí 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 / giải không hóa.

DataContractJsonSerializerbạn phải đánh dấu tất cả các lớp bạn muốn tuần tự hóa bằng DataContractatrtibute và tất cả các thành viên sử dụng DataMemberthuộc tính. Cũng như nếu một số lớp của bạn có thành viên enum, thì enum cũng phải được đánh dấu là DataContractvà mỗi thành viên enum - với EnumMemberthuộc tính. Đồng thời DataContractJsonSerializercho phép bạn kiểm soát tốt toàn bộ quá trình tuần tự hóa / giải tuần tự hóa bằng cách thay đổi logic phân giải các loại và thay thế các loại mà bạn tuần tự hóa bằng các đại diện.

Đối với JavaScriptSerializerbạn, bạn phải cung cấp hàm tạo không tham số nếu bạn dự định giải mã hóa các đối tượng từ chuỗi json.

Đối với tôi, tôi thường sử dụng JavaScriptSerializertrong logic trình bày, nơi có một mô hình đơn giản mà tôi muốn kết xuất trong Json cùng với trang mà không có yêu cầu ajax bổ sung. 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í nào cả. Nhưng nếu đó là logic liên tục, 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à lưu trữ không sql), để tải chúng sau này, tôi thích sử dụng hơn DataContractJsonSerializervì chi phí đặt thuộc tính có giá trị linh hoạt trong điều chỉnh quy trình tuần tự hóa / giải mã hóa, đặ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


2

Cá nhân tôi nghĩ đó là một DataContractJsonSerializerloạt các kỹ thuật quá mức. Tôi sẽ bỏ qua nó và đi cùng JavaScriptSerializer. Trong trường hợp JavaScriptSerializerkhông có sẵn, bạn có thể sử dụng FridayThe13th (một thư viện tôi đã viết; p).


Json.Net ở khắp mọi nơi. .Net 2.0, 3.5, 4.0, Silverlight, WindowsPhone
LB
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.