2010-04-03 14 views
6

Tôi hiểu cách XMLSerializer có thể hoạt động bằng cách sử dụng sự phản chiếu để tìm ra các trường đọc/ghi công khai hoặc các thuộc tính mà nó sẽ sử dụng để tuần tự hóa hoặc hủy xê-ri hóa XML. Tuy nhiên, XMLSerializer yêu cầu các trường công khai và đọc/ghi.DataContractSerializer ghi vào các trường riêng tư như thế nào?

Tuy nhiên, DataContractSerializer có thể đọc hoặc ghi vào hoặc từ các trường hoàn toàn riêng tư trong một lớp. Vì vậy, tôi tự hỏi làm thế nào điều này thậm chí có thể với ra một cách rõ ràng cho DataContractSerializer quyền truy cập bổ sung cho lớp học của tôi (es).

Trả lời

7

Phản ánh có nhiều tính năng. XmlSerializer có, thông qua "sgen.exe" khả năng xây dựng trước mã tuần tự hóa thành nhị phân (dll). Điều này hữu ích trong một số trường hợp không cho phép mã động, nhưng dll (giống như mã của bạn) được giới hạn trong API có thể truy cập.

Tuy nhiên ... phản ánh không phải là giới hạn này và với đủ quyền truy cập, bạn có thể thực hiện khá nhiều thứ. Đối với hiệu suất, có thể bạn không muốn sử dụng sự phản chiếu trực tiếp rất nhiều, nhưng nếu bạn có đủ quyền để tạo IL trực tiếp trong bộ nhớ (DynamicMethod), thì bạn có thể nói nó (trên cơ sở phương thức trên mỗi động) Type mã được liên kết với. Ví dụ: nếu tôi tạo một số DynamicMethod chuyển typeof(Foo) làm đối số owner thì phương pháp động đó có toàn quyền truy cập vào tất cả thành viên (bao gồm cả trường) trên Foo. Để biết thông tin, Delegate.CreateDelegate cung cấp quyền truy cập tương tự vào dữ liệu được bảo vệ khác. Vì DataContractSerializer không lo lắng về việc tạo trước, nó có thể sử dụng quyền truy cập này.

2

Nó cũng giống như cách mà XMLSerializer thực hiện bằng cách sử dụng sự phản chiếu.

Sự khác biệt là XMLSerializer sẽ không chạm vào trường riêng tư nhưng DataContractSerializer sẽ.

Xem this SO câu hỏi và câu trả lời về phản ánh và thay đổi trường riêng tư.